我使用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>
有人能告诉我一些错误吗?
答案 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/
你永远不会回头。