我需要正则表达式模式,所有字符包括空格,这在 PHP 中不是变量。
<li class="xyz" data-name="abc">
<span id="XXX">some words</span>
<div data-attribute="values">
<a class="klm" href="http://example.com/blabla">somethings</a>
</div>
<div class="xyz sub" data-name="abc-sub"><a href="http://www.example.com/blabla/images"><img src="/images/any_image.jpg" class="qqwwee"></a></div>
</li><!--repeating li tags-->
我写了一个模式;
preg_match_all('#<li((?s).*?)<div((?s).*?)href="((?s).*?)"((?s).*?)</li>#', $subject, $matches);
这很好用,但我不想得到四个变量。我只想得到
http://example.com/blabla
任何人都可以告诉我为什么这不那样工作?
preg_match_all('#<li[[?s].*?]<div[[?s].*?]href="((?s).*?)"[[?s].*?]</li>#', $subject, $matches);
使用 (?:)
将允许分组,但不会捕获这些组,例如:
#<li(?:(?s).*?)<div(?:(?s).*?)href="((?s).*?)"(?:(?s).*?)</li>#
将输出:
array (
0 =>
array (
0 => '<li class="xyz" data-name="abc">
<span id="XXX">some words</span>
<div data-attribute="values">
<a class="klm" href="http://example.com/blabla">somethings</a>
</div>
<div class="xyz sub" data-name="abc-sub"><a href="http://www.example.com/blabla/images"><img src="/images/any_image.jpg" class="qqwwee"></a></div>
</li>',
),
1 =>
array (
0 => 'http://example.com/blabla',
),
)
您的所有匹配项都将包含在 $matches[1]
中,因此请遍历它。
不要使用 RegExps 来解析 HTML
阅读这个关于StackOverflow的著名答案。
HTML不是一种常规语言,因此无法使用正则表达式可靠地处理它。相反,请使用适当的(和健壮的)HTML解析器。
另请注意,数据挖掘(分析)!=网络抓取(数据收集)。
如果您不希望正则表达式组存储"捕获"的数据,请使用非捕获标志。
(?:some-complex-regexp-here)
在您的情况下,以下方法可能有效:
(?s)<li.*?<div.*?href="([^"]*?)".*?</li>
但说真的,不要为此使用正则表达式;正则表达式很脆弱。请改用像/li//div//a//@href
这样的 xpath。