powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) echo preg_replace('/.*/','foo','foo');
13 сообщений из 13, страница 1 из 1
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468148
salx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему может работать неправильно вот этот регэксп( сравнивал с перлом) ?


Перл:
$_='foo';
s/.*/foo/;
print;
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468167
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понятно. А что нужно было получить?
----------------------------------------
Артисты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468171
salx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot 4m@t!c]Ничего не понятно. А что нужно было получить?

в случае перла получается просто foo, а пхп foofoo

вопрос: почему?
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468199
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
salxвопрос: почему?По качану. Телепаты в отпуске.
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468288
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO
Все дело в "жадности" алгоритма вычисления квантификатора '*'.
Perl использует жадный метод, т.е. '.*' вычисляет всю строку,
видимо PHP использует не столь жадный метод и вычиялет начало строки.
В перле данное поведение задается '.*?'
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468295
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
BlackStarвидимо PHP использует не столь жадный метод и вычиялет начало строки.Не бывает "не столь жадных методов" - либо жадный, либо нежадный - третьего не дано. А случай действительно интересный.
PS: неужели нельзя было повторить то, что в теме, в вопросе? Сбили, блин, с понталыгу поначалу...
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468317
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж.
И еще интереснее
Код: plaintext
1.
2.
bs@Hearse:~/prj> perl -e '$a="foo"; $a=~ s/.*?/[foo]/;print $a;'
[foo]foo

а PHP с кодом
Код: plaintext
1.
2.
3.
$rep = "[foo]";
$subj = "foo";
echo preg_replace( '/.*/', $rep, $subj );
выдает '[foo][foo]'

8-( ) Чегой то я совсем перестал это понимать.
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468333
VERS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может есть какое то эксплейн ...?
Код: plaintext
'/^.*$/'
или
Код: plaintext
ereg_replace
работает как надо :))
-------------------------------
www.free-lancer.ru
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33468382
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В мане нашел
В случае, если шаблон начинается с .* либо .{0,}, и установлен модификатор PCRE_DOTALL (являющийся аналогом Perl-опции /s), который позволяет метасимволу "точка" соответствовать переводу строки, шаблон неявно заякоривается. Это происходит поскольку все последующие конструкции будут сопоставляться с каждой символьной позицией в обрабатываемом тексте, и, как следствие, начало строки - единственная позиция, дающая наиболее полное совпадение. PCRE рассматривает каждый такой шаблон, как если бы ему предшествовала последовательность \A. В случае, если известно, что данные не содержат переводов строк, а сам шаблон начинается на .*, рекомендуется использовать PCRE_DOTALL для оптимизации шаблона, либо использовать метасимвол '^' для указания явного заякоривания.

Но все равно не понятно, почему появляется второй [foo].
----------------------------------------
Артисты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33470366
Шогал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый раз он захватывает всю строку "foo", второй раз он захватывает ничего , которое тоже попадает под шаблон .*
Проверочный скрипт:
Код: plaintext
1.
2.
  $rep = "[\\0]";
  $subj = "foo";
  echo preg_replace( "/.*/", $rep, $subj );
А вот в мануале я не нашел описание такого поведения, если найдете - процитируйте строку.
------------
CMD: Console of Must Die
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33470473
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второго раза быть вообще не должно, если только не выставлен модификатор /g.
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33470531
VERS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Шогал ведь может быть прав:
Код: plaintext
1.
2.
3.
$subj = "foo";
preg_match_all ('/.*/', $subj, $matches);
print_r($matches);
BlackStarВторого раза быть вообще не должно, если только не выставлен модификатор /g.
--
There Ain't No Such Thing As A Free Lunch
/g тут ни причем
ManualSearches subject for matches to pattern and replaces them with replacement. If limit is specified, then only limit matches will be replaced; if limit is omitted or is -1, then all matches are replaced.
...
Рейтинг: 0 / 0
(PHP) echo preg_replace('/.*/','foo','foo');
    #33470600
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, как! Век живи, век учись. Странное поведение для умолчания IMHO.
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) echo preg_replace('/.*/','foo','foo');
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]