0

単純なテンプレート言語を書いていますが、ネストされたステートメントに問題があります。たとえば、Foreachに使用しているこの正規表現は、次のとおりです。

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

すべて正常に動作しますが、foreachをforeachにネストすると、エラーが発生します。正規表現は最初の開始タグを取得しますが、2番目の終了タグを取得するためです。

{foreach $ XY}

{foreach $ YX} {/ foreach}

{/ foreach}

どうすればこれを解決できますか?ありがとうございました!

4

1 に答える 1

0

コメントで述べたように、正規表現はネストされたコンテキストの解析には最適ではありません。(特に、結果の解析ツリーを構築する場合。)

あなたがそれに一致することができることは決して少なくありません:

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

次のように使用できます:

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

これにより、最も外側の一致が得られます。

于 2013-03-14T15:21:17.660 に答える