【问题标题】:PHP regex match last occurrences of the pattern matchingPHP 正则表达式匹配模式匹配的最后一次出现
【发布时间】:2015-02-06 13:23:00
【问题描述】:

我知道有一个否定的前瞻正则表达式可以匹配字符串的最后一次出现。

示例:replace last occurrences of string

我想做这样的事情。

例子:

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

我试图做的是替换最后出现的 (.*) 但我失败了。我得到的输出是 hello example。它替换了整个第一个(和最后一个),即 (a) hello example (b) (c)

我的预期输出是hello example (a) hello example (b)

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

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您想在此处使用否定字符类而不是 .*?

    前瞻断言中的.* 将一直匹配到(...) 的最后一次出现,然后连续回溯,保持继承顺序继续进行。

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

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

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

    【讨论】:

    • 谢谢,它运行良好。你介意再解释一下吗?为什么需要使用否定字符?在这种情况下它是如何工作的?非常感谢。
    • @hwnd - 我试图像这样使用它preg_replace('/(?!\s+as\s+.*)/i', '', '(x as y) as z'); 试图摆脱最后的“ as...”(预期结果 = '(x as y)' - 但它不会取代任何东西. 知道有什么问题吗?
    【解决方案2】:

    您的错误是使用\(.*\) 它替换了以( 开头并以) 结尾的完整子字符串。 .* - 最大量词,(.*) - 最小量词。

    尝试使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多