Regex用于隔离尾随的嵌套引号标记

2022-03-22 00:00:00 regex php preg-replace

我使用的是一些经过多年升级的旧PHP论坛软件,但在此过程中,有些帖子的底部包含无报酬的[报价]区块。

我正在尝试找出一种运行PHP preg_place的方法来正则表达式它们。我只想删除显示在帖子内容下面的引用标记(可能还包含嵌套的引用标记)。

例如,保留原样的帖子可能如下所示:

Here is the example post text

[QUOTE]
This is an appropriate quote
[/QUOTE]

Here is more post content

在类似下面的帖子中,我想尝试删除最后一句挡路:

Here is the example post text

[QUOTE]
This is an appropriate quote
[/QUOTE]

Here is more post content

[QUOTE]
This is an unnecessary quote, as it's below all of the post text
   [QUOTE]
   Here's an unnecessary nested quote, just to confuse things.
   [/QUOTE]
[/QUOTE]

我花了几个小时试图想出一个正则表达式来捕获最后一种类型的引号块,但没有成功。我知道我需要以以下内容结束,因为结束引号在帖子的末尾总是有这个标签:

[/QUOTE]$

有没有办法捕获正则表达式中的整个最后引号块,包括任何可能的嵌套引号?到目前为止,我尝试过的任何操作都将尝试匹配嵌套的开始引号标记和最终结束标记(而不是匹配的对)。


解决方案

您可能希望使用递归,但是锚定方法:

([QUOTE[^][]*]
(?:[^][]++|(?1))++
[/QUOTE])

请参阅a demo on regex101.com。这里只匹配末尾的报价挡路()。

相关文章