我使用以下模式来匹配和替换一个简单的IF-ELSE-ENDIF块,使用preg_replace_callback
:
##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##
这里是关于正则表达式的演示。
我尝试使用递归运算符和正向先行断言来改进模式,但没有成功。目标是匹配和替换相关的IF-ELSE-ENDIF块,以允许用户定义有条件的文本块。
如果可能的话,我想避免为此改进编写语言解析器。
非常感谢任何建议!
preg_replace_callback
方法分享一下。 - Wiktor Stribiżew