|
|
|
| Доброе утро.
Извините, но название темы не мог придумать)))
Возник вопрос по работе preg_replace() и preg_match()
Есть строка "Ул.Мира, 54>46", нужно получить "Ул.Мира, 54".
Использую такое выражение для preg_replace()
<?php
$str = "Ул.Мира, 54>46";
$pattern = "#([\w]+)\>\d+#i";
echo preg_replace($pattern, "$1", $str);
//На выходе получаю нужную строку "Ул.Мира, 54".
|
Если тот же $pattern использовать для preg_match(), то выражение уже не работает, надо немного подредактировать.
Получается так
<?php
$str = "Ул.Мира, 54>46";
$pattern = "#([\w,. ]+)\>\d+#iu";
preg_match($pattern, $str, $out);
echo "<pre>";
print_r($out);
echo "</pre>";
/*
На выходе получаю
Array
(
[0] => Ул.Мира, 54>46
[1] => Ул.Мира, 54
)
*/
|
Разница между двумя $pattern очевидна
<?php
$pattern = "#([\w,. ]+)\>\d+#iu"; // для preg_match()
$pattern = "#([\w]+)\>\d+#i"; // для preg_replace()
|
Мне интересно, почему для preg_replace() срабатывает $pattern, хотя я не указал в символьном классе ни запятой, ни точки, ни пробельного символа, а вот уже для preg_match() эти символы надо указывать явно, плюс ко всему ещё и модификатор "u"?
C модификатором "u" понятно, использую кодировку utf-8, а вот с остальными символами нет. | |
|
|
|
|
|
|
|
для: Slo_Nik
(21.08.2013 в 11:27)
| | Элементарно, Ватсон =)
находит в строкетолькои заменяет на | |
|
|
|
|
|
|
|
для: Sfinks
(22.08.2013 в 20:49)
| | Вы не поняли меня
Мне интересно, почему для preg_replace() не надо указывать в $pattern точку, запятую и пробел, а для preg_match() надо? | |
|
|
|
|
|
|
|
для: Slo_Nik
(23.08.2013 в 00:15)
| | Я все понял. Это вы меня не поняли.
Все везде нужно указывать. Просто в данной конкретной ситуации, вы не замечаете разницы в результате из-за того, что он совпадает с ожидаемым.
Но
preg_replace( "#([\w]+)\>\d+#i", "$1", $str );
| находит в исходной строке не всю улицу, а только номер дома, > и последнее число.
Сами на листочке попробуйте в строке
Ул.Мира, 54>46
заменить
54>46
на
54
Что получится? Уж не
Ул.Мира, 54
ли?
Не находит preg_replace с таким шаблоном всю строку!
Просто совпало, что результат вас устраивает. | |
|
|
|
|
|
|
|
для: Sfinks
(23.08.2013 в 09:38)
| | Ну если выражение находит в строке только номер дома, то и заменить должен всю строку только на номер дома, а меняет полностью, с названием улицы с запятой, точкой и пробелом... | |
|
|
|
|
|
|
|
для: Slo_Nik
(23.08.2013 в 11:32)
| | С чего вы взяли? Меняется не вся строка, а участки, подходящие под шаблон.
Проверьте:
echo preg_replace( '#2#', '0', '1212121212' );
|
Ну или в вашем коде добавьте символы начала и конца строки, и уже ничего не будет заменено:
$pattern = "#^([\w]+)\>\d+$#i";
|
| |
|
|
|