2012-03-21 135 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

相关问题