preg_match的正则表达式无效

时间:2013-05-12 15:21:57

标签: php regex

我需要从网站上搜集一些数据。为此,我使用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>。其他人去哪儿了?为什么它不起作用?

2 个答案:

答案 0 :(得分:0)

试试这个:

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

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

答案 1 :(得分:0)

你真的不应该使用正则表达式来评估标记内容,特别是当你通过报废页面获取它时。

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

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

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

  3. 您的正则表达式要求您在href上的<a>属性的结束引用,但在您的示例标记中,您没有。如果在原始页面上你有一个结束语,那么下面的正则表达式就可以了。

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

  4. 然而,我不得不再次建议使用像DOMDocument这样的DOM解析器,因为它在处理标记内容时更加可靠,同时也因为它可以解释坏标记(如果它作为HTML加载)当然)。