1

との間のコードを正規表現を使用し{foreach}て抽出したい次のスニペットがあります。{/foreach}

{foreach (...)}
Some random HTML content <div class="">aklakdls</div> and some {$/r/template} markup inside.
{/foreach}

私は既に持っています:

{foreach [^}]*}

でもその後は何もマッチできません。トークン全体として{/foreach}を一致させる方法はありますか?{foreach}{/foreach}の間のコンテンツにも「{$」トークンを含めることができることに注意してください。

編集:BaileyPとTomalakの答えは正しいですが、簡単にするためにBaileyPの答えを選択しました。

4

2 に答える 2

5

私はこれを思いついた

/(?:{foreach .*?})(.*?)(?:{\/foreach})/gis

正規表現でテスト済み

于 2008-12-04T18:21:49.673 に答える
2

あなたの正規表現フレーバーが非貪欲なマッチングをサポートしていない場合は、次のようにしますが、サポートしているので@BaileyP's answerをお勧めします。

\{foreach [^}]*\}((?:.(?!\{/foreach\}))*[^{]?)

正規表現の好みに応じて、負のゼロ幅の先読みと非キャプチャ グループの外観は少し異なります。

コンポーネントは次のとおりです。

\{foreach [^}]*\} // ほとんど一目瞭然
( // 一致グループ 1 が開始されます (それが探しているものです)
 (?: // 非キャプチャ グループの開始
  . // なんでも...
  (?!\{/foreach\}) // ... "{/foreach}" が続かない
 )* // 非キャプチャ グループ終了、できるだけ頻繁に繰り返す
 [^{]? // "{" でない限り、最後の文字に一致します
) // グループ 1 の終了に一致、完了
于 2008-12-04T18:13:43.637 に答える