こんにちは私はphpの繰り返し正規表現でいくつかの問題を抱えています。{{if(x=y)? {{ true do something || false do something else }}
HTMLファイルのような文字列があり
ます。ある種の基本的なテンプレートエンジンになります。使用する場合
$matches=array();
$content = "{{if(x=y)? true do something || false do something else }}";
preg_match_all('/\{\{if\((.*?)\)\?(.*?)\|\|(.*?)\}\}/is',$content,$matches);
期待どおりの結果が返されます。
Array(
[0] => Array
(
[0] => {{if(x=y)?
true do something
||
false do something else
}}
)
[1] => Array
(
[0] => x=y
)
[2] => Array
(
[0] => true do something
)
[3] => Array
(
[0] => false do something else
)
)
しかし、パターンが次のような別のパターンとネストされている場合。
{{if(x=y)?
{{if(y=z)?
true do something
||
false do something else
}}
||
{{if(x=a)?
true do something
||
false do something else
}}
}}
パターンの終わりとして最初の"}}"文字を取り、失敗します
Array
(
[0] => Array
(
[0] => {{if(x=y)?
{{if(y=z)?
true do something
||
false do something else
}}
)
[1] => Array
(
[0] => x=y
)
[2] => Array
(
[0] => {{if(y=z)?
true do something
)
[3] => Array
(
[0] =>
false do something else
)
)
繰り返し正規表現を作成したいので、trueまたはfalseの各部分で、一致したコンテンツが再び同じパターンを持っているかどうかを確認する必要があります。Ifの論理部分はすでに実行されています。結果をループできるように、正規表現がパーツと一致する必要があります。正規表現の知識があれば、これまでにできることはこれだけです。より説明的に編集 する正規表現がこのようなものを解析できる必要があります。
{{if()?{{if()?{{if()?...||...}}||{{if()?...||...}}}}||{{if()?{{if()?...||...}}||{{if()?...||...}}}}}}
しかし、私が使用した正規表現は、最初の{{iftofirst}}からしかキャッチできません。
{{if(){{if(){{if()...||...}}
これは正規表現に対して正しいです。しかし、正規表現を「テキスト全体を取得し、{{if()?と}}の間のブロックを最後まで見つけて、最後にない場合は他のブロックを無視する」または「最も外側の{{if ()?||}}ブロック。ありがとう