PHP的正则表达式匹配模式匹配的最后一次出现

问题描述:

我知道有一个负面的lookahead正则表达式可以匹配最后一次出现的字符串。PHP的正则表达式匹配模式匹配的最后一次出现

例子:replace last occurrences of string

我想要做这样的事情。

例子:

$string = 'hello example (a) hello example (b) (c)'; 
echo preg_replace('/\(.*?\)(?!.*\(.*?\))/', '', $string); 

我试图做的是,以取代过去的事件,但我失败了(*)。我得到的输出是hello example。它取代了整个第一个(和最后一个),它是(a)hello example(b)(c)

我的预期输出是你好例子(a)你好例子(b)

任何人都可以提供一些提示吗?什么是正确的正则表达式来实现我想要的。非常感谢你。

你想在这里使用否定字符类而不是.*?

您的预见声明中的.*将一直匹配到最后一次出现(...),然后连续回溯以保持连续顺序。

preg_replace('/\([^)]*\)(?!.*\([^)]*\))/', '', $string); 

为了简化此任务,只需保留所有内容,直到最后一次出现为止。

preg_replace('/.*\K\(.*?\)/', '', $string); 
+0

谢谢你,它完美的作品。你介意多解释一下吗?为什么需要使用否定字符?在这种情况下它是如何工作的?非常感谢你。 – overshadow 2015-02-06 05:06:04

+0

@hwnd - 我试图像这样使用它'preg_replace('/(?!\ s + as \ s +。*)/ i','','(x as y)as z');'试图获得摆脱最后的“as ...”(预期的结果=''(x as y)'' - 但它不能代替任何东西。任何想法有什么不对? – user9645 2017-01-06 19:43:21

特殊照顾错误是使用\(.*\)它完全替代其子蒙山开始和(蒙山)结束。 .* - 最大量化器,(.*) - 最小量化器。

尝试使用:

$string = 'hello example (a) hello example (b) (c)'; echo preg_replace('/\((.*)\)$/', '', $string);