2012-03-21 124 views
0

我正在使用PHP處理文件。正則表達式:匹配所有直到某個字(PHP)

該文件包含一些以「Step」開頭的塊(步驟1,步驟2等),並始終以「結束步驟」結束。有了它,它可以有新行,但從來沒有2。

我想建立一個正則表達式,將它變成一個數組。

我有什麼到目前爲止

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

在patnern年底/ s是允許將包括newslines了。 但是,當然,這不起作用,因爲所有來自「結束步驟」的字母都被排除,不僅僅是它們形成1個字。我怎樣才能寫出正確的正則表達式?

+0

你可以發佈文件內容的一部分嗎? – 2012-03-21 10:01:29

+0

你能發表一個你想要匹配的文本的例子嗎? – Chris 2012-03-21 10:01:47

回答

2

一個簡單的方法:

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

這與從Step到最近"end step"任何文本。但是它需要在每一個可能很慢的字符之後回溯。

稍微更加明確,並可能更有效::

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

這符合所有文本從Step直到但不包括最近"end step"。如果"end step"永遠不會到達,它將匹配到字符串的結尾。這個正則表達式在每一步都會檢查字符串"end step"是否可以在那裏匹配,如果是,則結束匹配。

+0

謝謝!這個?在*之後做詭計! – user410932 2012-03-21 10:04:30

+1

@user如果你想知道'''在那種情況下做了什麼,它只是告訴'。*'不要太貪心,一找到第一個''結束步驟''就停下來。 – 2012-03-21 10:06:55

+0

The?使得量詞懶惰而不是貪婪。但是,你是否在意詳細闡述你在精心製作的內容,以及爲什麼這可能更有效? – barsju 2012-03-21 10:07:30

相關問題