可以只使用一个正则表达式吗?
编辑:请不要抱怨我解析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在输入的同一行。