【问题标题】:Regular expression for parsing links from a webpage?用于解析网页链接的正则表达式?
【发布时间】:2010-09-05 14:11:30
【问题描述】:

我正在寻找一种 .NET 正则表达式,可以从网页中提取所有 URL,但还没有找到一个足够全面的方法来涵盖您可以指定链接的所有不同方式。

还有一个附带问题:

是否有一个正则表达式来统治所有这些?还是我最好使用一系列不太复杂的正则表达式,只对原始 HTML 使用多重传递? (速度与可维护性)

【问题讨论】:

标签: .net html regex


【解决方案1】:

查看 URI 规范。这可以帮助你很多。就性能而言,您几乎可以在一个普通网页中提取所有 HTTP 链接。当我说谦虚时,我绝对不是指像 ELisp 手册那样包含所有 HTML 手册的一页。性能也是一个敏感的话题。我的建议是衡量你的表现,然后决定是使用一个正则表达式还是使用多个更简单的正则表达式来提取所有链接。

http://gbiv.com/protocols/uri/rfc/rfc3986.html

【讨论】:

    【解决方案2】:

    网址?在图像/脚本/css/等中?

    %href="(.["]*)"%

    【讨论】:

      【解决方案3】:

      只要 HTML 的作者使用引号,这将捕获所有 a 标签中的 URL:

      <a[^>]+href="([^"]+)"[^>]*>
      

      我做了一个例子here

      【讨论】:

        【解决方案4】:

        我没有时间尝试考虑一个可能不起作用的正则表达式,但我想评论说你绝对应该打破你的正则表达式,至少如果它到达this level of ugliness

        (?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
        )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
        \r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
        ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
        \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
        ....*SNIP*....
        *))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
        +|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
        .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
        |(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
        ?:\r\n)?[ \t])*))*)?;\s*)
        

        (这应该与电子邮件地址匹配)

        编辑:我什至无法将它放在一篇文章中,这太恶心了....

        【讨论】:

          【解决方案5】:
          ((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
          

          我是从regexlib.com那里得到的

          [编者注:{1} 在这个正则表达式中没有真正的功能; see this post]

          【讨论】:

            【解决方案6】:

            所有 HTTP 和 MAILTO

            (["'])(mailto:|http:).*?\1
            

            由 href 或 src 调用的所有链接,包括相对链接。

            #Matches things in single or double quotes, but not the quotes themselves
            (?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=\1)
            
            #Maches thing in either double or single quotes, including the quotes.
            (["'])((?<=href=")|(?<=src=")).*?\1
            

            然而,第二个只会为您提供使用双引号的链接。

            【讨论】:

              【解决方案7】:

              使用Html Agility Pack,您可以使用:

              HtmlDocument doc = new HtmlDocument();
              doc.Load("file.htm");
              foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
              {
              Response.Write(link["href"].Value);
              }
              doc.Save("file.htm");
              

              【讨论】:

                【解决方案8】:

                来自 RegexBuddy 库:

                网址:全文查找

                最后的字符类确保如果 URL 是某些文本的一部分,则 URL 后的逗号或句号等标点不会被解释为 URL 的一部分。

                \b(https?|ftp|file)://[-A-Z0-9+&amp;@#/%?=~_|!:,.;]*[-A-Z0-9+&amp;@#/%=~_|]

                【讨论】:

                  【解决方案9】:

                  根据https://www.rfc-editor.org/rfc/rfc3986

                  从任何文本(不仅仅是 HTML)中提取 url

                  (http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2018-09-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-11-06
                    • 1970-01-01
                    相关资源
                    最近更新 更多