14

为什么下面的代码:

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

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

我有兴趣了解为什么会发生重复。

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

在这里修补一个现场版本。

4

3 回答 3

8

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

  1. 整个字符串abcabc.def
  2. 空字符串 →.def

这给出了abc.def.def.


编辑:它发生的细节在String.replaceAll() 异常中用 regex 中的贪婪量词进行了解释。

于 2012-05-30T16:07:27.077 回答
3

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

这是预期的行为,并不是 PHP 特有的。* 量词允许在主题字符串的末尾出现“空”匹配。

于 2012-05-30T16:09:34.003 回答
2

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

.defa.defb.defc.def

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

于 2012-05-30T16:14:20.640 回答