正则表达式 - 获取包含给定标记的最短文本

时间:2011-12-13 15:54:35

标签: php regex preg-match

这可以只用一个正则表达式来完成吗?

编辑:请不要抱怨我解析HTML :)同样的情况可以用纯文本重现:

提供的源字符串:

Lorem 1 ipsum. Lorem 2 ipsum TOKEN 
foo. Lorem 3 ipsum

提供的源字符串HTML版本:

<div id="entry-1">Lorem ipsum</div>
<div id="entry-2">Lorem ipsum TOKEN</div>
<div id="entry-3">Lorem ipsum</div>

我想要的是什么:

2 ,因为“Lorem ipsum”包含令牌。

我正在尝试使用:/([0-9]+).*TOKEN/sm,但我得到1,因为它在找到第一个“数字”后开始寻找TOKEN,即1。

使用两个分离的正则表达式/ preg_match很容易,但我想知道这种方法是否可以改进。

提前感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

尝试非贪婪*

/entry-([0-9]+).*?TOKEN/sm

不适用于所有平台,但它可能会起作用(是javascript吗?)

答案 1 :(得分:0)

我会使用积极的lookbehind确保你匹配TOKEN,如下:

<div id="entry-([0-9]+)">.*(?<=TOKEN)</div>

你可以像这样使用它:

$result = preg_match('%<div id="entry-([0-9]+)">.*(?<=TOKEN)</div>%i', $subject, $matches);

这将匹配第二个示例,但不匹配第一个或第三个示例。

答案 2 :(得分:0)

你的正则表达式是正确的,但问题出在s修饰符上,导致.也匹配换行符,这使得你的正则表达式匹配1。放下s

此外,您不需要m修饰符,因为您没有在正则表达式中使用锚点。

See it

此答案假定entry-[0-9]和TOKEN在输入中位于同一行。