我需要从网站上搜集一些数据。为此,我使用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>
。其他人去哪儿了?为什么它不起作用?
答案 0 :(得分:0)
试试这个:
#title=\"Russia\"/></a>(\s*)<small>\*</small>\s+<a\s+href=\"/profile/(.+?)\"#sx
我逃脱了*
,因为它是一个元字符。如果没有它,您将匹配包含单词small
后跟零或更多>
s的字符串。
答案 1 :(得分:0)
你真的不应该使用正则表达式来评估标记内容,特别是当你通过报废页面获取它时。
在你的情况下,至少有三个原因可能导致破坏你的正则表达式。
当您只使用代表“任何空白字符”的\s
时,不要尝试编写自己的空白评估器
在正则表达式中,星号(*)具有特殊含义,这就是为什么您不能简单地使用它来识别星号。如果您想收集小属性中的内容,请改为使用<small>(.*)</small>
。另一方面,如果你实际上期待一个星号,那么你必须像<small>\*</small>
一样逃避它。
您的正则表达式要求您在href
上的<a>
属性的结束引用,但在您的示例标记中,您没有。如果在原始页面上你有一个结束语,那么下面的正则表达式就可以了。
#title=\"Russia\"\/><\/a>(\s*)<small>\*</small> <a href="/profile/(.+)?\"#sx
然而,我不得不再次建议使用像DOMDocument这样的DOM解析器,因为它在处理标记内容时更加可靠,同时也因为它可以解释坏标记(如果它作为HTML加载)当然)。