-2

我需要从网站上抓取一些数据。为此,我正在使用 preg_match,但我无法为其编写正则表达式。网站上的数据是

title="Russia"/></a>
        <small>*</small> <a href="/profile/roman

我把正则表达式写成#title=\"Russia\"\/><\/a>((\n|\r)*)<small>*<\/small> <a href=\"/profile/(.+?)\"#sx

但这不起作用,我不知道为什么?当我回显我的正则表达式时,它说#title="Russia"\/><\/a>(( | )*)*<\/small>。其他人去哪儿了?为什么它不起作用?

4

2 回答 2

0

尝试这个:

#title=\"Russia\"/></a>(\s*)<small>\*</small>\s+<a\s+href=\"/profile/(.+?)\"#sx

我已经逃脱了,*因为它是一个元字符。没有它,您将匹配包含单词small后跟零个或多个>s 的字符串。

于 2013-05-13T13:45:25.680 回答
0

您真的不应该使用正则表达式来评估标记内容,尤其是当您通过抓取页面获取它时。

在您的情况下,至少有三个原因可能会破坏您的正则表达式。

  1. \s当您可以简单地使用代表“任何空白字符”时,不要尝试编写自己的空白评估器

  2. 在正则表达式中,星号 (*) 具有特殊含义,这就是为什么您不能简单地使用它来识别星号的原因。如果你想在 small 属性中收集内容,你应该使用它<small>(.*)</small>。另一方面,如果您实际上期望一个星号,那么您必须像这样逃避它<small>\*</small>

  3. 您的正则表达式期望href最后一个属性的结束引号,<a>但在您的示例标记中您没有。如果在原始页面上您确实有一个结束引号,那么以下正则表达式应该可以解决问题。

    #title=\"Russia\"\/><\/a>(\s*)<small>\*</small> <a href="/profile/(.+)?\"#sx

然而,我不得不再次建议使用DOMDocument之类的 DOM 解析器,不仅因为它在处理标记内容时更加可靠,而且因为它也可以解释错误的标记(当然,如果它作为 HTML 加载)。

于 2013-05-13T14:11:32.027 回答