正则表达式所有内容,包括空格


Regex Everything Including Whitespace

我需要正则表达式模式,所有字符包括空格,这在 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。