preg_replace внутри цикла while - PullRequest
1 голос
/ 16 июня 2011

Почему этот пример не работает:

$string='1000000000000';

while($string=preg_replace('/(\d)((\d\d\d)+\b)/','$1,$2',$string)){}
echo $string."<br>";

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

эта альтернатива работает:

$string='10000000000000';

while(preg_match("/(\d)((\d\d\d)+\b)/",$string)){
    $string=preg_replace("/(\d)((\d\d\d)+\b)/","$1,$2",$string);
    }
    echo $string."<br>";

Мой вопрос: функция preg_replace возвращает некоторое значение ИСТИНА / ЛОЖЬ, когда регулярное выражение по-прежнему не может соответствовать? Если вернуть False, почему в первом примере цикл никогда не останавливается. Я пытался с:

while((regex)!==FALSE)
while((regex)==TRUE)

и это не работает.

Меня не волнует, как ставить запятые, я хочу знать о функции preg_replace

Если кто-то может мне помочь. было бы замечательно. спасибо

Ответы [ 3 ]

4 голосов
/ 16 июня 2011

Необязательный 5-й параметр для preg_replace(), $count, должен использоваться для отслеживания количества произведенных замен.

Ваш цикл может выглядеть как

do {
    $string = preg_replace('/(\d)((\d\d\d)+\b)/','$1,$2', $string, 1, $count);
} while ($count);

Или, альтернативноэто регулярное выражение выполнит работу за один шаг

 $string = preg_replace('/(?!^)(?=(?>\d{3})+$)/', ',', $string);
1 голос
/ 16 июня 2011

If matches are found, the new subject will be returned, otherwise subject will be returned unchanged or NULL if an error occurred.

http://php.net/manual/en/function.preg-replace.php

Итак, код должен быть:

while(($string=preg_replace('/(\d)((\d\d\d)+\b)/','$1,$2',$string)) !== $string){}

... Я думаю ... даже не уверенесли это действительно PHP ...

1 голос
/ 16 июня 2011

Из руководства :

Если совпадения найдены, новый предмет будет возвращен, в противном случае предмет будет возвращен без изменений или NULL, если произошла ошибка.

Таким образом, до тех пор, пока не возникнет ошибка, ваше назначение всегда будет оцениваться как true (строка оценивается как true).

Что вы можете сделать, это сравнить возвращаемое значениезначение для предмета, если они совпадают, совпадений не найдено:

while ($string != preg_replace('/(\d)((\d\d\d)+\b)/','$1,$2',$string))
{
  // a match was found
}
...