Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите разобраться
 
 автор: Slo_Nik   (21.08.2013 в 11:27)   письмо автору
 
 

Доброе утро.
Извините, но название темы не мог придумать)))

Возник вопрос по работе 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, а вот с остальными символами нет.

  Ответить  
 
 автор: Sfinks   (22.08.2013 в 20:49)   письмо автору
 
   для: Slo_Nik   (21.08.2013 в 11:27)
 

Элементарно, Ватсон =)

"#([\w]+)\>\d+#i"
находит в строке
"Ул.Мира, 54>46"
только
54>46
и заменяет на
54

  Ответить  
 
 автор: Slo_Nik   (23.08.2013 в 00:15)   письмо автору
 
   для: Sfinks   (22.08.2013 в 20:49)
 

Вы не поняли меня
Мне интересно, почему для preg_replace() не надо указывать в $pattern точку, запятую и пробел, а для preg_match() надо?

  Ответить  
 
 автор: Sfinks   (23.08.2013 в 09:38)   письмо автору
 
   для: Slo_Nik   (23.08.2013 в 00:15)
 

Я все понял. Это вы меня не поняли.
Все везде нужно указывать. Просто в данной конкретной ситуации, вы не замечаете разницы в результате из-за того, что он совпадает с ожидаемым.
Но
preg_replace( "#([\w]+)\>\d+#i", "$1", $str );
находит в исходной строке не всю улицу, а только номер дома, > и последнее число.

Сами на листочке попробуйте в строке
Ул.Мира, 54>46
заменить
54>46
на
54
Что получится? Уж не
Ул.Мира, 54
ли?

Не находит preg_replace с таким шаблоном всю строку!
Просто совпало, что результат вас устраивает.

  Ответить  
 
 автор: Slo_Nik   (23.08.2013 в 11:32)   письмо автору
 
   для: Sfinks   (23.08.2013 в 09:38)
 

Ну если выражение находит в строке только номер дома, то и заменить должен всю строку только на номер дома, а меняет полностью, с названием улицы с запятой, точкой и пробелом...

  Ответить  
 
 автор: Sfinks   (23.08.2013 в 17:26)   письмо автору
 
   для: Slo_Nik   (23.08.2013 в 11:32)
 

С чего вы взяли? Меняется не вся строка, а участки, подходящие под шаблон.

Проверьте:
echo preg_replace( '#2#', '0', '1212121212' );

Ну или в вашем коде добавьте символы начала и конца строки, и уже ничего не будет заменено:
$pattern = "#^([\w]+)\>\d+$#i";

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования