preg_replace有异常对我不起作用

时间:2013-01-30 22:14:10

标签: php regex preg-replace

我已经遇到了“小问题”...... 我只想用其他名字或其他东西替换一些名字。 它到目前为止工作正常,但有一些名字我遇到了问题。

例如,我想将"Cho"替换为"Cho'Gath", 但我当然不想将"Cho'Gath"替换为"Cho'Gath'Gath"

因此我创建了这个正则表达式,并替换"Cho"以外的所有"Cho'Gath"

/\bCho(?!.+Gath)\b/i

这样做并且它不会取代"Cho'Gath",但它也不会取代"Cho Hello World Gath" ......这是我的第一个问题!

第二个是以下内容:我还要替换所有"Yi",而不是"Master Yi",所以我尝试使用以下正则表达式:

/\b(?!Master.+)Yi\b/i

这不会取代"Master Yi",好的。但它也不会取代"Yi",但它应该做到! (我也试过/\b(?!Master(**\s**))Yi\b/i,但这也行不通)

到目前为止,我不知道该怎么做...有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

对于第一个正则表达式:

\bCho(?!.Gath)\b

第二个:

(?<!\bMaster )Yi\b

你的第一个正则表达式中有.+,即一个字符,一次或多次;并且由于量词在默认情况下是贪婪的,这会吞下整个输入,然后不情愿地回馈以匹配下一个标记(G)。

你的第二个正则表达式使用了负向前瞻,你想要的是一个负面的 lookbehind 。也就是说,之前的位置与该位置不匹配的位置。

请注意,lookbehinds中的正则表达式必须是有限的长度。

答案 1 :(得分:0)

如果您将.+替换为您想要匹配(或不匹配)的实际字符,则可以轻松解决您的第一个问题:',但让我们看看第二个问题,非常有趣:

  

我也想替换所有“易”,但不是“易师傅”,所以我试过了   与以下正则表达式相同:

/\b(?!Master.+)Yi\b/i

这是\b的负面预测。表达确实匹配单个“Yi”,但看看它对“Yi Yi”的作用:

Hello I am Master Yi
                 ^
                 \b

此边界后面没有“Master”,但后面跟着“Yi”。所以你的表达式也匹配这个字符串中的“Yi”。

否定前瞻是毫无意义的,因为它检查直接跟随“Yi”的边界(记住前瞻断言只是“向前看”而不向前移动指针)并不直接跟随“Master”。情况总是这样。

您可以使用lookbehind断言,但只能使用(无论如何不必要).+,因为lookbehind断言必须具有固定的长度:

/\b(?<!Master )Yi\b/i

匹配前面没有“Master”的每个“Yi”。