正则表达式包含空格的所有内容不要使用RegExps来解析HTML

问题描述 投票:-1回答:2

我需要一个正则表达式模式所有字符,包括空格,而不是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);
php regex web-scraping
2个回答
0
投票

使用(?:)将允许分组但是不会捕获这些组,例如,以下内容:

#<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]中,因此请仔细阅读。


0
投票

Don't use RegExps to parse HTML

在StackOverflow上阅读这个着名的答案。

HTML不是常规语言,因此无法使用RegExp可靠地处理它。相反,使用适当的(强大的)HTML解析器。

另请注意数据挖掘(分析)!= (数据收集)。

如果您不希望正则表达式组存储“捕获”数据,请使用非捕获标记。

(?:some-complex-regexp-here)

在您的情况下,以下可能有效:

(?s)<li.*?<div.*?href="([^"]*?)".*?</li>

但严重的是,不要使用正则表达式;正则表达式很脆弱。使用像这样的/li//div//a//@href

© www.soinside.com 2019 - 2024. All rights reserved.