【发布时间】:2013-07-31 13:07:15
【问题描述】:
我当然遗漏了一些明显的东西,因为这非常简单,但这是我遇到的问题。
在抓取网站时,我会提取一些格式类似于以下内容的链接:
<a href="/test.php?var1=123&var2=456&var3=789">SomeString</a>
虽然有时一些链接看起来像:
<a href="/test.php?var1=123&var2=456&var3=789" title="sometitle">SomeString</a>
使用像下面这样的正则表达式有效,但它添加了我不想要的匹配:
'/<a href=\"/test.php\?var1=([0-9]+)&var2=([0-9]+)&var3=([0-9]+)\"(^.*?)>(^.*?)<\/a>'
所以很明显我在这里得到了一个我不想要的匹配,但它确实考虑了“标题”变量出现的可能性。有没有办法告诉 preg_match_all() “这里可能有东西,但你应该忽略它”或者如果它找到它,它匹配它?
谢谢。
编辑,因为不清楚:
在我的原始示例中,我想找出 var1、var2、var3 等于什么,以及和之间的文本(在我的示例中为 SomeString)。如果我正在浏览一个有很多结果的页面,有时字符串中会包含“title=”,这会使我的正则表达式失效。所以我想告诉它“这可能在这里,但不匹配,忽略它”。
【问题讨论】:
-
如果您不想使用极其复杂的正则表达式,您可能会发现简单地将所有
title="sometitle"实例替换为""(无)会更简单。 -
你能说出你想用正则表达式做什么吗?你不想得到数字结果?
-
不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php。
-
这可能不是正则表达式的工作,而是你选择的语言的现有工具。正则表达式不是你在碰巧涉及字符串的每个问题上挥舞的魔杖.您可能希望使用已经编写、测试和调试过的现有代码。在 PHP 中,使用
parse_url函数。 Perl:URImodule。红宝石:URImodule。 .NET:'Uri' class -
@AndyLester:
parse_url不适用于相对网址。
标签: php regex html-parsing preg-match-all