while循环中的preg_replace

时间:2011-06-15 20:58:13

标签: php regex loops preg-replace while-loop

为什么这个例子不起作用:

$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函数返回一些TRUE / FALSE值? 如果返回False,为什么在第一个例子中循环永远不会停止。 我试过:

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

它不起作用。

我不在乎如何放逗号, 我想知道preg_replace函数

如果有人可以帮助我。 会很好。 感谢

3 个答案:

答案 0 :(得分:4)

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 :(得分:1)

来自manual

  

如果找到匹配项,将返回新主题,否则主题将保持不变,如果发生错误,则返回NULL。

因此,只要没有错误发生,您的作业将始终评估为true(字符串的评估结果为true)。

您可以做的是将回报值与主题进行比较,如果它们相同,则找不到匹配项:

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

答案 2 :(得分:1)

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 ......