2011-11-03 9 views
0

今まで私は正常に電子メールアドレスが有効であることを確認する以外に、正規表現では大したことを避けることに成功しました。しかし、大規模な大学プロジェクトの一環として、私は単純な魅力的なエンジンを開発しています。ループを処理するための簡単な構文を実装しようとしています。私は多くの人が気にしない、あるいは既存のシステムを使用すると言うでしょうが、それが私の論文のためにできるだけ多くのものを私自身の仕事にしたいと思います!PHP正規表現ヘルプ/解説

とにかく、問題に戻ってください。私は、一例として、私のテンプレートファイルに次のコードを持っている:

<p>Template Header</p> 
{{foreach{array1}}} 
    <p>This is the first content line that should be displayed.</p> 
{{/foreach}} 
{{foreach{array2}}} 
    <p>This is the second content line that should be displayed.</p> 
{{/foreach}} 
<p>Template Footer</p> 

私は、その後、ファイルを読み込むループを探し、それらを抽出するために、次のPHPを持っています。

<?php 
$template = file_get_contents('reg.html'); 
$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is"; 
$result = preg_replace($expression, "$1", $template); 
var_dump($result); 
?> 

にpreg_replaceを呼び出し、$ 1は私にループ(配列1または配列2)、そして$ 2へ、それを変更することが私にループのタグの間にコンテンツを与えるために使用される配列名を与えている結果をダンプします。完璧。問題は1つの{{foreach}}タグに対してのみ機能することです。

とにかく私は上記の結果を得るために正規表現のすべてのマッチをループすることができますか?助けやアドバイスをいただければ幸いですが、簡単に行く正規表現はかなり新しいです!

+0

これは、正規表現には適していません。 'foreach'や' if'ブロックをネストしようとするとすぐに、残酷な時間があります。正規表現を悪用して何かを一緒に束ねるのではなく、実際のパーサを書く必要があります。 – meagar

答えて

1
$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is"; 
       ^^         ^^ 

"foreach"テンプレートタグだけでなく、その前と後ろのすべてにも一致しています。つまり、2番目のforeachは.*でも食べることになります。だからあなたはそれを再び一致させることはできません。

+1

これを追加すると、具体的には、これらの 'foreach'ブロックのいずれかが含まれている場合には文字列全体と一致し、' foreach'ブロックの内容で文字列全体を置換します。つまり、ただ食べただけではなく、_replaced_です。 –