这可以只用一个正则表达式来完成吗?
编辑:请不要抱怨我解析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很容易,但我想知道这种方法是否可以改进。
提前感谢您的帮助:)
答案 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
修饰符,因为您没有在正则表达式中使用锚点。
此答案假定entry-[0-9]
和TOKEN在输入中位于同一行。