PHP模板语言

时间:2013-03-14 15:09:38

标签: php regex

我编写简单的模板语言,但我对嵌套语句有问题。例如,我使用Foreach,这个正则表达式:

preg_match('/\{foreach +\$(.*?)\}(.*?){\/foreach\}/sui', $this->content, $matches);

一切正常,但是当我将foreach嵌入foreach时,我会收到错误。因为正则表达式获得第一个打开标记但是第二个结束标记。

  

{foreach $ XY}

     

{foreach $ YX} {/ foreach}

     

{/ foreach}的

我该如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

如评论中所述,正则表达式不是解析嵌套上下文的最佳选择。 (特别是如果你想构建一个结果的解析树。)

永远不能与之匹敌:

(?xi) {foreach \s++ \$\w++ } (?: [^{}]++ | (?R) )*+ {/foreach}

可以用作:

preg_match_all(',{foreach \s++ \$\w++ } (?: [^{}]++ | (?R) )*+ {/foreach},xi', $str, $matches);

这将为您提供最外面的匹配。