PCRE模式来检测嵌套匹配

时间:2018-07-26 12:58:43

标签: php regex recursion pcre

我使用以下模式来匹配并使用preg_replace_callback替换一个简单的IF-ELSE-ENDIF块:

##IF (.*?)##(.*?)(?:##ELSE##(.*?))?##ENDIF##

以下两个示例已正确匹配并替换

1. ##IF x()## foo ##ENDIF##

Result:

Group 1: `x()`
Group 2: ` foo `

2. ##IF y()## foo ##ELSE## bar ##ENDIF##

Result:

Group 1: `y()`
Group 2: ` foo `
Group 3: ` bar `

现在,我想增强此功能,以允许嵌套的IF-ELSE块,例如

##IF g()## pre-outer-if ##IF h()## inner-if ##ENDIF## post-outer-if ##ELSE## outer-else ##ENDIF##

这是regex101.com上的a demo

我尝试通过递归运算符和积极的前瞻来增强模式,但是我没有成功。目标是匹配并替换相关的IF-ELSE-ENDIF块,以允许用户定义条件文本块。

如果可能的话,我想避免为此功能编写语言解析器。

非常感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

尝试一下:

##IF (?>(.*?)##)((?>(?0)|.)*?)(?:##ELSE##((?>(?0)|.)*?))?##ENDIF##

它将找到一个外部if块组。