【问题标题】:regex c# extracting url from <a> tag正则表达式 c# 从 <a> 标签中提取 url
【发布时间】:2017-02-08 16:21:09
【问题描述】:

我正在尝试从标签中提取 URL,但是,我得到的不是https://website.com/-id1,而是标签链接文本。这是我的代码:

string text="<a style=\"font - weight: bold; \" href=\"https://website.com/-id1\">MyLink</a>";

 string parsed = Regex.Replace(text, " <[^>] + href =\"([^\"]+)\"[^>]*>", "$1 " );

    parsed = Regex.Replace(parsed, "<[^>]+>", "");

    Console.WriteLine(parsed);

我得到的结果是 MyLink,这不是我想要的。我想要类似的东西

https://website.com/-id1

任何帮助或链接将不胜感激。

【问题讨论】:

标签: c# regex url extract


【解决方案1】:

正则表达式可以用在非常具体、简单的 HTML 案例中。例如,如果文本只包含单个标签,则可以使用"href\\s*=\\s*\"(?&lt;url&gt;.*?)\""提取URL,例如:

var url=Regex.Match(text,"href\\s*=\\s*\"(?<url>.*?)\"").Groups["url"].Value;

此模式将返回:

https://website.com/-id1

这个正则表达式没有做任何花哨的事情。它使用可能的空格查找href=,然后以非贪婪的方式(.*?)捕获第一个双引号和下一个双引号之间的任何内容。这是在命名组url 中捕获的。

任何更花哨的东西都会变得非常复杂。例如,同时支持单引号和双引号将需要特殊处理以避免以单引号开头并以双引号结尾。该字符串可以有多个&lt;a&gt; 使用这两种引号类型的标签。

对于复杂的解析,最好使用像 AngleSharpHtmlAgilityPack 这样的库

【讨论】:

  • 我想支持HtmlAgilityPack的推荐。正如the most famous SO answer of all time 会告诉你的,混合正则表达式和HTML 通常是个坏主意。坚持解析库,为您提供一些面向对象的东西。
  • 谢谢@Panagiotis;既是为了答案,也是为了洞察力。我会调查他们。
【解决方案2】:

试试这个:

var input = "<a style=\"font - weight: bold; \" href=\"https://website.com/-id1\">MyLink</a><a style=\"font - weight: bold; \" href=\"https://website.com/-id2\">MyLink2</a>";
var r = new Regex("<a.*?href=\"(.*?)\".*?>");
var output = r.Matches(input);
var urls = new List<string>();
foreach (var item in output) {
    urls.Add((item as Match).Groups[1].Value);
}

它会找到所有的 a 标签并提取它们的 href 值,然后将其存储在 urls 列表中。

说明

&lt;a 匹配 标记的开头
.*?href= 匹配任何内容直到 href=
"(.*?)"match 并捕获 ""
.*?&gt; 匹配
标记的结尾

【讨论】:

  • 谢谢。一个很好的洞察力。您能否对我的问题投赞成票,以便我对答案投赞成票。现在,我只有 13 个声望,我还需要 2 个。提前致谢。
  • 谢谢,非常感谢:)
猜你喜欢
  • 2018-05-14
  • 2011-12-24
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多