用于检测嵌套匹配的 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 块组。
我使用以下模式来匹配和替换使用 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 块组。