2011-12-23 2 views
1

私は自分自身で1つの作業正規表現を生成することはできません。私が考えているごとに、たとえ単純なケースであっても、私はまだ失敗します。私は何十もの似たような質問を数多く研究し、すべてのテクニックを試しましたが、それでも動作しません。ここで正規表現の文字列を読み込む正規表現が機能しないのはなぜですか?

は、私は "パース" しようとしているフォーマットです:

{{Taxobox
任意の文字列がここにありませんが、決して二重の中括弧ができ
}}

ここに来ますテキストの段落は、それは任意の文字列を含めることができますが、 は二重の等号(==)

==これはヘッダ

あるが含まれることはありません

私がしようとしているのは、Taxobox {{}}の後と==ヘッダの前にあるものをすべて抽出することです。これは私が持っているものです:

$pattern = "/\{\{Taxobox[^\}]*\}\}(.*?)==/"; 
if (preg_match($pattern, $pagecontent, $matches)) { 
var_dump($matches); 
} 

この一致の結果は何もありません。私は最初の部分が、(。*?)がTaxoblockに首尾よくマッチするまで知っています。今度はそれ以降のすべてのものをマッチングするだけです。==に達するまでです。なぜこの最後の部分がうまくいかないのか分かりません。

答えて

1

あなたは.は改行も考えてみましょうするs修飾子を必要とする、とあなたはTaxobox内容についてより正確に、あなたの表現を少し変更する必要があります。

のは、これを試してみましょう:現在まだ@fge答え、ない試合と組み合わせる/ mの/ sのを使用して

/\{\{Taxobox.*?\}\}(.*?)==/s 
+0

これはうまくいきました。私の学習のために、私はまだこのパターンがなぜ働いているのか疑問に思いますか? – Ferdy

+1

単に 's'修飾子のために、' .'でマッチした文字クラスに改行も考慮するようにエンジンに指示します。そして、あなたのバージョンがあまりにも機能しているなら、 '{{Taxobox}}'部分を少し修正しました。私の正規表現は、 '{{Taxobox'文字列の後に続く部分' \} \} 'が見つかるまで何かをマッチさせるように指示するだけです。 –

2

あなたの正規表現では、[^\}]*が、閉じ中括弧にマッチしますが、(.*?)は一致しないパターンにつながる、何もしかし改行の多くを一致します。

.に改行を含めるには、正規表現にs修飾子(reference here)を使用します。

+0

おかげで、。 – Ferdy

+0

Hmmm。それは奇妙です、それは[それは私のために働く]ため(http://ideone.com/lvpno)... –

+0

確かに、私は違いを説明することはできません。 – Ferdy

1

最初の点:これは複数行です。改行をドットで照合できるように、修飾子/sを追加します。

第2ポイント:.*?を使用しないでください。怠惰な量指定子は絶対に避けてください。

第3のポイント:文字クラスで}をエスケープする必要はなく、ちょうど[^}]と書いてください。

は、この正規表現を試してみてください:

$pattern = "/(?<=\}\})(.+)(?===))/ms"; 
+1

'm'修飾子は'^'と' $ 'アンカーの振る舞いを変更します。' s'(dotall)修飾子は '.'も改行文字にマッチさせることを意味します。 – stema

+0

なぜ怠惰な数量化を避けるべきですか? –

+0

私は '/ m'を意味しますが、私は正規表現でドットを使用しません。 '/ s'修飾子は、PHPの補完された文字クラスにも影響を及ぼす場合にはおそらく便利です。それは? – fge

関連する問題