0

我执行这个:

$string = preg_replace('/^([^\|]*)(?!\|\|Read)/','$1||Read',"test||Read");
echo "$string<br>";
$string = preg_replace('/^([^\|]*)(?!.*Read)/','$1||Read',"test||Read");
echo "$string<br>";

我明白了:

tes||Readt||Read
test||Read

这个想法是在字符串(不包含管道)之后添加“||Read”,如果它不存在。那么为什么第一个 RegEx 中的 * 只消耗“tes”?

第二个正则表达式有效,因为第一个 * 使用“tes”,而断言中的第二个 * 匹配“t||” .

4

1 回答 1

2

您可以通过在量词后添加一个加号来使其更加贪婪或“占有欲” :+*

 ([^\|]*+)

所以你的代码变成:

 $string = preg_replace('/^([^\|]*+)(?!\|\|Read)/','$1||Read',"test||Read");

对于您的测试用例来说,这不会t结束。

在您的情况下,||Read应该始终出现在行尾?如果是这样,您也可以只使用^(.*?)$for 匹配,并改为断言 line end (?<!Read)$

于 2012-08-05T13:22:21.520 回答