2017-08-27 10 views
3

入れ子の条件コード内の{IF} - {ENDIF} - ステートメントと一致するRegExを検索しています。誰にもアイデアはありますか?例えばPHP:ネスト化された{IF} {ENDIF}条件のRegEx

{IF bla}Text 1{ELSEIF ble}Text 2 {IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} Main text end{/ENDIF} 

私はちょうど私が#\{IF .*\}.*\{ENDIF\}#isを試みたが、私は文字列全体を取得し、これは動作しない

{IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} 

を取得したいです。

重要:コードには複数の改行や改行があることがあります。

BLA、BLE、BLIなど動的であり、

+1

はこちら(XML/HTMLの構文解析に似)の方法です。私はテキストを手動で解析することを検討します(あなたが{キーワードをチェックする}を押すと、テキストを横断する)。この方法で、自分でツリーを構築し、必要なノードをすべて取得できます。 – insider

+0

長い検索と失敗の後、私はその解決策を使用しました。 – kilian

答えて

1

ブロック場合、これはあなたの内をつかむ異なる場合があります:

/{IF(?:.*?(?={IF)(*SKIP)(*FAIL)|.*?){ENDIF}/ 

Demo(279段階)

パターンが(*SKIP)(*FAIL)を使用し、「失格を「内部IFブロックを含むすべてのIFブロック。この方法では、最も内側のIFブロックだけを取得します。

コード:(Demo

$string='{IF bla}Text 1{ELSEIF ble}Text 2 {IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} Main text end{/ENDIF}'; 
echo preg_match('/{IF(?:.*?(?={IF)(*SKIP)(*FAIL)|.*?){ENDIF}/',$string,$match)?$match[0]:'fail'; 

出力:否定先読みで

{IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} 

またはより高速/よりよい:

/{IF(?!.*{IF).*?{ENDIF}/ 

Demo(190段階)

インナーIF-ELSE
1

{IF(?!.*{IF).*?}.*?{ENDIF}

  • (?!.*{IF)その位置から前方に見え、それが早い試合で停止する命令です?
  • 怠惰な数量と一致しません主張しています。私は正規表現と思ういけない

Demo

関連する問題