我需要一个正则表达式模式所有字符,包括空格,而不是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]
中,因此请仔细阅读。
在StackOverflow上阅读这个着名的答案。
HTML不是常规语言,因此无法使用RegExp可靠地处理它。相反,使用适当的(强大的)HTML解析器。
另请注意数据挖掘(分析)!= web-scraping(数据收集)。
如果您不希望正则表达式组存储“捕获”数据,请使用非捕获标记。
(?:some-complex-regexp-here)
在您的情况下,以下可能有效:
(?s)<li.*?<div.*?href="([^"]*?)".*?</li>
但严重的是,不要使用正则表达式;正则表达式很脆弱。使用像xpath这样的/li//div//a//@href
。