为什么preg_replace与/(。*)/重复部分字符串?

时间:2012-05-30 15:57:00

标签: php regex preg-replace

为什么以下代码:

<?php echo preg_replace("/(.*)/", "$1.def", "abc");

输出abc.def.def而不是abc.def

我很想知道重复发生的原因。

使用/(.+)//^(.*)$/按预期工作,但我不是在寻找解决方案,只是提出问题(尽管这些模式可能与答案有关)。

使用实时版here修补。

3 个答案:

答案 0 :(得分:8)

因为.*匹配字符串末尾的空子字符串。这意味着字符串abc有两个匹配项:

  1. 整个字符串abcabc.def
  2. 空字符串→.def
  3. 给出了abc.def.def


    编辑 String.replaceAll() anomaly with greedy quantifiers in regex 中解释了原因的详细说明。

答案 1 :(得分:3)

这是预期的行为:https://bugs.php.net/bug.php?id=53855

  

这是预期的行为,没有PHP特有的。 *   量词允许在你的结尾发生“空”匹配   主题字符串。

答案 2 :(得分:2)

如果你让你的正则表达式非贪婪,/(.*?)/你可以看到整个重复过程的工作范围更大/更明显:

.defa.defb.defc.def

你得到四场比赛:a,b,c,empty。然而,正如其他人提到的那样,使用贪婪的正则表达式,你得到2个匹配,完整的字符串和空字符串。