我使用以下模式来匹配并使用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块,以允许用户定义条件文本块。
如果可能的话,我想避免为此功能编写语言解析器。
非常感谢您的任何建议!
答案 0 :(得分:1)
尝试一下:
##IF (?>(.*?)##)((?>(?0)|.)*?)(?:##ELSE##((?>(?0)|.)*?))?##ENDIF##
它将找到一个外部if块组。