【问题标题】:Regex to Parse Hyperlinks and Descriptions正则表达式解析超链接和描述
【发布时间】:2008-08-25 16:05:29
【问题描述】:

C#:解析超链接及其描述的好的正则表达式是什么?

请考虑不区分大小写、空格和在 HREF 标记周围使用单引号(而不是双引号)。

还请考虑获取在<a> 标签中包含其他标签的超链接,例如<b><i>

【问题讨论】:

    标签: html regex


    【解决方案1】:

    只要没有嵌套标签(并且没有换行符),以下变体就可以正常工作:

    <a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a>
    

    一旦嵌套标签开始发挥作用,正则表达式就不适合解析。但是,您仍然可以通过应用现代解释器的更高级功能(取决于您的正则表达式机器)来使用它们。例如。 .NET 正则表达式使用堆栈;我发现了这个:

    (?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 
    

    来源:http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

    【讨论】:

      【解决方案2】:

      StackOverflow: Regular expression for parsing links from a webpage?查看这个例子

      使用The HTML Agility Pack,您可以解析 html,并使用 HTML 的语义提取详细信息,而不是使用损坏的正则表达式。

      【讨论】:

      • 完全正确 - 正则表达式很棒,但在 HTML 或 XML 上使用它们会很痛苦。
      • +1 用于 HTML 敏捷包。最近有人向我提出了这个建议,效果很好。
      【解决方案3】:

      I found this 但显然these guys 遇到了一些问题。

      编辑:(有效!)
      我现在已经完成了自己的测试,发现它可以工作,我不懂 C#,所以我不能给你一个 C# 的答案,但我知道 PHP,这是我从运行它得到的匹配数组:

      <a href="pages/index.php" title="the title">Text</a>
      
      array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 
      

      【讨论】:

        【解决方案4】:

        have a regex 处理大多数情况,但我相信它确实匹配多行注释中的 HTML。

        它是使用 .NET 语法编写的,但应该很容易翻译。

        【讨论】:

          【解决方案5】:

          既然我已经开始工作了,就要把这个 sn-p 扔出去。这是一个较早前建议的不那么贪婪的版本。如果输入有多个超链接,原始文件将不起作用。下面的代码将允许您遍历所有超链接:

          static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
          public void ParseHyperlinks(string html)
          {
             MatchCollection mcHref = rHref.Matches(html);
          
             foreach (Match m in mcHref)
                AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value);
          }
          

          【讨论】:

            【解决方案6】:

            这是一个匹配平衡标签的正则表达式。

            (?:""'[""'].*?>)(?(?>(?)|(?)|.)+)(?(DEPTH)(?!)) (?:)

            【讨论】:

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