Поведение регулярного выражения /(.*)/

XtremallyPurpur

Новичок
Поведение регулярного выражения /(.*)/

PHP:
  echo preg_replace('/(.*)/', '100$1', '123');
Выводит 100123100.

Почему?
 

XtremallyPurpur

Новичок
2iceman
Спасибо, я знаю, как правильно. :)
Мой вопрос, почему оно себя так странно ведет?
 

x-yuri

Новичок
очевидно потому, что после замены производится еще одна попытка, а шаблон подходит под оставшуюся часть строки (пустая строка)
 

XtremallyPurpur

Новичок
x-yuri
Квантификатор "*" - жадный, т.е. он выберет всю строку до конца. Непонятно, почему будет еще одна попытка?
 

maxwell

artifex
XtremallyPurpur, всю строку до конца + пустое значение.
Смотри, сначала твое выражение находит 123, а потом оно находит "ничего" (пустоту) и тоже заменяет.
 

XtremallyPurpur

Новичок
Почему после того, что уже нечего выбирать (* выбрал всю строку) производится еще одна попытка поиска?

P.S. Кто Фридла недавно читал/перечитывал? :)
 

x-yuri

Новичок
потому что после замены всегда производится еще одна попытка
Код:
while( TRUE ) {
    ищем
    if( нашли )
        производим замену
    else
        break;
}
c preg_match_all то же самое , но разработчики признали этот баг-репорт как Bogus :)
 

x-yuri

Новичок
это поведение не является частью библиотеки pcre. Возможно так было изначально (в Perl или где там), а потом исправлять не стали по причине совместимости, а в других языках скопировали поведение
 

x-yuri

Новичок
может и так
кстати, в приведенном мною баг-репорте человек непоследователен. Если уж убирать "пустое совпадение", то для обоих случаев
 

MiksIr

miksir@home:~$
Автор оригинала: x-yuri
это поведение не является частью библиотеки pcre.
Вот, является. Хотя, конечно, какой-то сюр
Код:
$ pcretest
PCRE version 7.9 2009-04-11
  re> /(.*)/g
data> 123
 0: 123
 1: 123
 0:
 1:
data>
-~{}~ 14.08.09 19:14:

Причины этого можно найти в pcredemo.c
 

x-yuri

Новичок
Вот, является. Хотя, конечно, какой-то сюр
я сказал "не является" потому, что оно находится не в самой библиотеке, а в php-расширении pcre

-~{}~ 14.08.09 20:39:

по поводу логики, я тоже думал сначала, что странная, но, например, какой результат ожидается от preg_match_all( '/c?/', 'ab', $m ); ? Три пустые строки, т.е. последнее пустое совпадение включается. Значит и для других случаев должно включаться
 

MiksIr

miksir@home:~$
В общем, лениться не нужно - пишите более точный регэксп - и все будет хорошо =)
/^(.*)$/
 

MiksIr

miksir@home:~$
А причем тут жадность? Я вот в манах ничего про это поведение не нашел =)
 
Сверху