PHP preg_match()ungreedy匹配问题

时间:2011-10-14 20:32:49

标签: php regex preg-match

我使用PHP模式修饰符“U”来反转preg_match()的默认贪婪行为。但是,它不能按我想要的方式工作。我的代码:

$str = '<p>
<div><a aaa
    <a href="a.mov"></a>
  </div>
</p>';

$needle = "a.mov";

$pattern = "/\<a.*".preg_quote($needle, "/").".*\<\/a\>/sU";

preg_match($pattern, $str, $matches);
print_r($matches);

我正在尝试匹配

<a href="a.mov"></a>

但是这段代码让我回头

<a aaa
    <a href="a.mov"></a>

有人能告诉我一些错误吗?

2 个答案:

答案 0 :(得分:2)

嗯,从一般意义上讲,你在尝试用regexp解析HTML时做错了,但是关于你提供的代码片段,问题是ungreedy修饰符告诉*+{n,}一旦他们开心而不是一路走来就会停止。

所以它实质上会影响匹配的结束而不是它开始的位置 - “ungreedy”意图表示“尽可能给我最短”的匹配。

您可以使用mU修饰符而不是sU修复此特定示例,以便.与新行匹配。

答案 1 :(得分:0)

我的阵列也变空了。当您尝试将Regex与HTML一起使用时,您必须小心使用换行符。单线模式可能存在问题。

请参阅:http://www.regular-expressions.info/dot.html

我已经使用正则表达式成功解析了HTML,但我不会继续这样做。看看

http://simplehtmldom.sourceforge.net/

你永远不会回头。

相关问题