【问题标题】:Get URL from HTML code using a regular expression使用正则表达式从 HTML 代码中获取 URL
【发布时间】:2010-12-21 15:07:11
【问题描述】:

考虑:

<div><a href="http://anirudhagupta.blogspot.com/">Anirudha Web blog</a></div>

得到http://anirudhagupta.blogspot.com/的正则表达式是什么 从以下?

<div><a href="http://anirudhagupta.blogspot.com/">Anirudha Web blog</a></div>

如果你在 C# 中提出一些建议,那就太好了。我也喜欢 jQuery 来做这件事。

【问题讨论】:

  • 不要使用正则表达式处理 HTML,它会让你发疯! stackoverflow.com/questions/1732348/…
  • @soulmerge,我同意你的观点,但似乎他/她只是抓取 url 地址,而不是解析 HTML 代码
  • 你不知道互联网网址是从 http:// https://
  • 您是要从纯文本中提取链接,还是 &lt;a href=... 也是模式的一部分?
  • @Rubens Farias - URL 是用 HTML 编写的,因此必须解析 HTML 代码(并对实体进行解码等)。

标签: c# asp.net regex asp.net-mvc url


【解决方案1】:

如果您想使用 jQuery,您可以执行以下操作。

$('a').attr('href')

【讨论】:

    【解决方案2】:

    又快又脏:

    href="(.*?)"
    

    好的,让我们使用另一个正则表达式来解析 URL。这来自RFC 2396 - URI Generic Syntax: Parsing a URI Reference with a Regular Expression

    ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
    

    当然,您可以在 HTML 代码中包含相对 URL 地址,您需要以另一种方式对其进行寻址;我可以推荐你使用 C# Uri Constructor (Uri, String)

    【讨论】:

    • 不,谢谢,但我说以编程方式获取意味着说正则表达式以获取 url
    • @Gupta,我没听懂你的评论;两者都是正则表达式。
    • 不错的尝试,但是 (a) *? FWIS 在世界上的正则表达式风格中很少见(b)您的第二个正则表达式中的错误太多,无法开始列出它们
    • @Stewart,这个怎么样?
    • @Rubens Farias 别担心我说我怎么能通过正则表达式来做到这一点
    【解决方案3】:

    最简单的方法是使用以下正则表达式。

    /href="([^"]+)"/
    

    这将获取第一个引号中的所有字符,直到找到一个是引号的字符。在大多数语言中,这是获取带引号的字符串的最快方法,该字符串本身不能包含引号。在属性中使用引号时应进行编码。

    更新:用于解析 URL 的完整 Perl 程序如下所示:

    use 5.010;
    
    while (<>) {
        push @matches, m/href="([^"]+)"/gi;
        push @matches, m/href='([^']+)'/gi;
        push @matches, m/href=([^"'][^>\s]*)[>\s]+/gi;
        say for @matches;
    }
    

    它从标准输入读取并打印所有 URL。它处理三个可能的报价。将它与curl 一起使用以查找网页中的所有 URL:

    curl url | perl urls.pl
    

    【讨论】:

    • 在野外,HTML 可能是致命的。 href=a.html 是“有效的”,或者至少应该和 href="a.html" 一样工作,并且在大多数情况下,应该转义的特殊字符不是 cough google 咳嗽
    • 正确,使用来自网络的信息时有很多陷阱。另一方面,如果我需要从一个可以看到所有可能问题(或通过测试找出)的网页中查找 url,我将在使用更重的工具之前使用此正则表达式(或变体)。不过,这一切都取决于情况,这看起来像是“完成”的情况。
    • 等等……这根本行不通。属性值可以有“,”或没有分隔符。
    【解决方案4】:

    执行此操作的正确方法是将 HTML 加载到 C# XML 解析器中,然后使用 XPath 查询 URL。这样你就完全不用担心解析了。

    【讨论】:

    【解决方案5】:

    您不需要复杂的正则表达式或 HTML 解析器,因为您只想提取链接。这是一种通用的方法。

    data="""
    <html>
    abcd ef ....
    blah blah <div><a href="http://anirudhagupta.blogspot.com/">Anirudha Web blog</a></div>
    blah  ...
    <div><a href="http://mike.blogspot.com/">Mike's Web blog
    </a></div>
    end...
    </html>
    """    
    for item in data.split("</a>"):
        if "<a href" in item:
            start_of_href = item.index("<a href") # get where <a href=" is
            print item[start_of_href+len('<a href="'):] # print substring from <a href onwards. 
    

    以上是 Python 代码,但您的想法可以在您的 C# 语言中进行调整。使用 "&lt;/a&gt;" 作为分隔符拆分您的 HTML 字符串。遍历每个拆分字段,检查"href",然后获取"href" 之后的substr。那将是您的链接。

    【讨论】:

    • 这似乎比正则表达式更复杂!
    • 复杂,因为它有更多的单词?你更愿意看一篇用英文写的文章还是用数字编码的文章,每个数字代表一个字母?它的类比相同。正则表达式背后的作用与我发布的大致相同。字符串操作,除了它更清楚地呈现给读者,而不是让读者猜测你的代码是什么意思
    • 以 Ruben 发布的正则表达式为例。说真的,如果你能一眼看出它是什么意思,我脱掉你的帽子。
    • 您还可以在这里确保代码得到优化。谁知道正则表达式会做什么......你知道 是拆分代码的最佳位置 - 会比正则表达式好得多。
    • 请看我下面的评论——这是“不复杂”的做法。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2023-03-18
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多