preg_replace

erotic

У меня возникли непонятки по работе этой замечательной функции: она проверяет строку на совпадения и заменяет до тех пор, пока уже нечего будет заменять, или только один раз?
Вот два примера:
Первый пример

$s = '12345';
$s = preg_replace('/1|2|3|4|5/', '', $s);
echo $s;

Печатает пустую строку. Т.е. функция, по моему разумению, прошла один раз по строке, нашла совпадение с '1', заменила ее на пустую строку, пошла второй раз, нашла совпадение с двоечкой, и так далее, пока не заменила все совпадения на пустые строки.
Второй пример

$s = 'trashwith_text';
$s = preg_replace('/.*?(with_text|text)/i', '\\1', $s);
echo $s;

На выходе получаю 'with_text', при этом неважно, в каком порядке я напишу в паттерне: 'text|with_text' или 'with_text|text'
Т.е. по моему разумению, должно происходить так: проход по строке, нашли совпадение с 'with_text', заменили его и получили строку 'with_text'. Далее второй проход, нашли совпадение с 'text', заменили строку на 'text', в итоге получили строку 'text'.
Почему второй замены не происходит?

bobby

1. Потому что поиск после замены идет уже не от начала строки.
2. Если сделать так, как ты хочешь, то оно может зациклиться нахуй. Тебе это надо?

erotic

А вот по второму примеру - совпадение всегда ищется с самым длинным паттерном? А как сделать, чтобы с коротким искалось?

artimon

Убрать вопросительный знак.
Вернее, в данном случае вообще проще написать
/.*?(text)/i

erotic

убрать вопросительный знак
блин, да, туплю
Оставить комментарий
Имя или ник:
Комментарий: