我编写简单的模板语言,但我对嵌套语句有问题。例如,我使用Foreach,这个正则表达式:
preg_match('/\{foreach +\$(.*?)\}(.*?){\/foreach\}/sui', $this->content, $matches);
一切正常,但是当我将foreach嵌入foreach时,我会收到错误。因为正则表达式获得第一个打开标记但是第二个结束标记。
{foreach $ XY}
{foreach $ YX} {/ foreach}
{/ foreach}的
我该如何解决这个问题?谢谢!
答案 0 :(得分:0)
如评论中所述,正则表达式不是解析嵌套上下文的最佳选择。 (特别是如果你想构建一个结果的解析树。)
永远不能与之匹敌:
(?xi) {foreach \s++ \$\w++ } (?: [^{}]++ | (?R) )*+ {/foreach}
可以用作:
preg_match_all(',{foreach \s++ \$\w++ } (?: [^{}]++ | (?R) )*+ {/foreach},xi', $str, $matches);
这将为您提供最外面的匹配。