正则表达式如何向前看,看看是否有另一个匹配的结束部分?

时间:2012-02-10 04:31:05

标签: php regex bbcode lookahead

我正在使用正则表达式模式来查找[code] [/ code] BB标签的实例。 (这是在PHP中使用preg_match / preg_relace / etc的珍珠型正则表达式)

'~\[code\](.*?)\[\/code\]~is'

好吧,我的问题是我怎么能这样做,所以有人可以输入类似的内容:

[code][code]code here[/code][/code]

输入此内容的目的是向新手演示如何将代码放入[code] [/ code]标签。

目前,如果我键入它,正则表达式将停止在“[/ code]”的第一个实例,而不是继续向前看,以查看“[code]”的第二个实例

由于我是新用户,我无法发布图片,但这里是输出的屏幕截图: http://i.imgur.com/t8zNh.png

我知道正则表达式中有一个术语称为“积极向前看”和“消极向前看”,但我不太确定它们的含义,或者它们是否与我的情况相关。有人可以帮我一把吗?谢谢。

编辑:我很抱歉,但我似乎没有足够的代表来+1。我非常感谢你的帮助,而且速度非常快。

3 个答案:

答案 0 :(得分:2)

你可以尝试这种模式

'~\[code\](.*?)(\[\/code\])+~is'

答案 1 :(得分:1)

如果您还要涵盖两个结束标记之间可以有更多代码的情况,您可以试试这个

\[code\].*?\[\/code\](?:(?:(?!\[code\]).)*\[\/code\])?

here on Regexr

第一部分\[code\].*?\[\/code\]从第一个开始标记到第一个结束标记匹配。

然后是棘手的部分,现在是可选的。如果后面没有开始标记,则(?:(?:(?!\[code\]).)*\[\/code\])?匹配字符,直到找到最后一个结束标记。

答案 2 :(得分:0)

您正在查看的是删除?

中的(.*?)

使用?时,它是一个懒人匹配,并且会尽可能匹配少数字符,这就是它在看到第一个[/code]

时停止的原因

没有?,它是一个贪婪的匹配,将匹配尽可能多的字符,并匹配到外部结束标记。