php, preg_replace
По моему, она и должна проводиться столько раз, сколько возможно.http://php.net/preg_replace:
limit
The maximum possible replacements for each pattern in each subject string. Defaults to -1 (no limit).
Я делал это так:
function my_preg_replace($pattern,$replacement,$string) {Работает, конечно, не только со строками - с массивами тоже.
$tmp2=$string;
$tmp1='';
while($tmp2!=$tmp1) {
$tmp1=$tmp2;
$tmp2=preg_replace($pattern,$replacement,$tmp1);
}
return $tmp2;
}
function my_preg_replace( $pattern, $replacement, $string )
{
$count = 0;
do
{
$string = preg_replace( $pattern, $replacement, $string, -1, count );
} while ( $count );
return $string;
}
Выглядит менее очевидно.
Правда, работает только в PHP5.
И выглядит, кстати, более очевидно, на мой взгляд1) "Строка изменилась" - более очевидно, чем "было сделано 0 замен".
2) Мой метод подходит абсолютно для всех функций, модифицирующих строку. Не только для preg_replace в PHP >=5 - для всего.
Ну отлично ведь!
Что ты сэкономишь две длины строки в оперативной памяти?
А так - и у тебя хорошо, и у меня хорошо, зачем спорить.
Если ты любовался - то как не заметил в нём ошибку?
Зачем? При первом же прогоне исправлю. Главное, что идея правильная, доллар можно и забыть где-нибудь.
А пока что полюбуешься, какой у тебя красивый и нерабочий код получился?
$str = "abababab";
$str =~ s/b/A/;
# Here $str = "aAababab"
$str =~ s/b/A/g;
# Here $str = "aAaAaAaA"
Это рабочий код, там просто забыт $.
Более того, он будет работать даже и в таком виде с notice'ом, что непонятно, что это за count, использую как я $count.
Автору нужно, судя по всему (и мы говорим именно об этом как регулярным выражением ~s/aa/a/ преобразовать строку, состоящую из миллиона букв "a", в строку, состоящую из одной буквы a.
Твои же выражения в первом случае дают строку из 999999 букв "а", во втором - из 500000 букв "а".
Пенартур хочет, чтобы регексп прогонялся до тех пор, пока он срабатывает, а не чтобы везде менял.
Он выдаст notice, что не знает константу count, и передаст preg_replace'у строку 'count'.
Что, естественно, даст тебе бесконечный цикл.
UPD: Ошибся, не бесконечный - простозамена произведётся только один раз.
Но скорее всего, все будет еще хуже. count - это же функция, то есть может, по идее, попросить аргументы к ней. Не знаю, я не силен в php на уровне "доебаться к собеседнику".
Главное, что я за один-два прогона этот код сделаю рабочим, даже если там какой-то символ пропущен.
Автору нужно, судя по всему (и мы говорим именно об этом как регулярным выражением ~s/aa/a/ преобразовать строку, состоящую из миллиона букв "a", в строку, состоящую из одной буквы a.ну это же еще проще в перле:
$str = 'aaaaaaaaaaaaaaaaBBBaaaaaaaaaaaaaa';
$str =~ s/a+/a/g;
#Here $str = 'aBBBa'
Или это тоже не то, что нужно?
Я говрол не о конкретных буквах "а", а о том, что хочется заменять, пока заменяется.
Вот представь себе замену:
$str=preg_replace("/^(\d\d+)$/e","\\1+\\2",$str)
Если хочется из строки, представляющей число, получить строку, представляющую остаток от деления этого числа на 9.
Конечно, ты и на этот частный случай можешь придумать свой особый метод.
А вот в этих двух случаях ты видишь что-нибудь общее?
Более того, он будет работать даже и в таком виде с notice'ом, что непонятно, что это за count, использую как я $count.интересно.... В ПХП4 при появлении count без доллара, она заменяется на строку 'count'. В том случае, если функция preg_replace (забудем на минуту о том, что она делает и какие у неё параметры) не воспринимает последний аргумент или не требует там переменной, твоя функция прогонит preg_replace ОДИН раз, при чем ты получишь нотайс о преобразовании count в 'count'... Не особо грозный нотайс. Если бы ты не написал $count = 0; , вылетел бы более (имхо) грозный нотайс - неопределённая переменная.
Хотя, впрочем, без строчки $count = 0; и с поправленным вызовом функции, твой код более красивый, опять-же имхо.
Мне же нужно объявить $count заранее.
thnx, именно это я имел ввиду
Мне же нужно объявить $count заранее.Ну так ты объявляй её прямо при вызове функции... Переменную можно объявить везде, где ей задаётся значение. А смысла задавать значение, которое гарантированно перезапишется не вижу.
Впрочем, разговор, имхо, теряет смысл... Почему-то на php.net нету никакого указание на дополнительный параметр.
http://ru.php.net/manual/ru/function.preg-replace.php
Офигеть. А я-то думал, что русско-английский мануал такой же, как и английский. И часто там такое несовпадение?
ChangeLogВидимо, нечасто - 5.1.0 вышел не так давно, а в русском переводе, судя по всему, просто осталась старая версия.
Version Description
4.0.1pl2 Added the limit parameter
4.0.4 Added the '$n' form for the replacement parameter
5.1.0 Added the count parameter
Оставить комментарий
Vodnik
можно как нибудь (указать модификатор и тп) чтобы замена проводилась не один раз, а столько сколько возможно?