Regex -获取包含给定标记的最短文本


Regex - Getting the shortest text containing a given token

可以只使用一个正则表达式吗?

编辑:请不要抱怨我解析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。

使用两个分开的regex/preg_match很容易,但我想知道这种方法是否可以改进。

提前感谢您的帮助:)

试试不贪心*

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

不能在所有平台上工作,但它可能在那工作(是javascript吗?)

我将使用正面的look - behind来确保您匹配TOKEN,如下所示:

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

你可以这样使用:

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

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

您的正则表达式是正确的,但问题是s修饰符导致.也匹配换行符,这使得您的正则表达式匹配1。删除s .

你也不需要m修饰符,因为你没有在你的正则表达式中使用锚。

看到它

这个答案假设entry-[0-9]和TOKEN在输入的同一行。