用于检测嵌套匹配的 PCRE 模式

PCRE pattern to detect nested matches

我使用以下模式来匹配和替换使用 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 块以允许用户定义条件文本块。

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

非常感谢任何建议!

试试这个:

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

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