2012-03-21 20 views
0

PHPでファイルを処理しています。正規表現:特定の単語まですべて一致(PHP)

このファイルには、常に「ステップ」(ステップ1、ステップ2など)という単語で始まり、常に「終了ステップ」で終わるブロックがいくつか含まれています。それに伴い、改行を持つことはできますが、決して2にはなりません。

これを配列に変換する正規表現を作成しようとしています。私が持っているもの

は、これまで

preg_match_all("/Step([^\"end step\"]*)/s", $content, $matches); 

patnernの末尾に/ sがのNewsLinesがあまりにも含まれるようにすることであるです。 もちろん、「終わりのステップ」からのすべての文字が1単語を形成するだけでなく、除外されるため、これは機能しません。どのように正しい正規表現を書くことができますか?

+0

あなたはファイルのコンテンツの一部を投稿できますか? –

+0

あなたは一致させたいテキストの例を投稿できますか? – Chris

答えて

2

一つの簡単な方法は:

preg_match_all('/Step(.*?)"end step"/s', $content, $matches); 

これは、最寄り"end step"からStepから任意のテキストと一致します。しかし、それは遅くなる可能性のあるすべての文字の後ろに戻る必要があります。

少しより明確と、おそらく、より効率的な::

preg_match_all('/Step((?:(?!"end step").)*)/s', $content, $matches); 

これは、最大Stepからすべてのテキストと一致したが、最寄りの"end step"は含みません。 "end step"が決して来なければ、文字列の最後まで一致します。この正規表現は、すべてのステップを先読みして、文字列"end step"がそこにマッチする可能性があるかどうかをチェックし、真であればマッチを終了します。

+0

ありがとう! ? *がトリックをやった後! – user410932

+1

@userその場合に '?'が何をするのか不思議であれば、単に '。*'に貪欲でないように指示し、最初の終了ステップを見つけたらすぐに停止します。 –

+0

?あなたが精巧なもので何をやっているのか、なぜそれがおそらくより効率的であるかを精緻化するのに気を使いますか? – barsju

関連する問題