使用C#正则表达式从<a>标签中提取URL

3

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

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

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

1
https://dev59.com/X3I-5IYBdhLWcg3wq6do - René Vogt
@rkun,你不是在解析,而是在替换。你应该使用.Match来捕获URL,而不是试图删除URL之外的任何内容。例如:.Match(text,""href\\s*=\\s*\".*?\"") - Panagiotis Kanavos
1
可能是查找<a>链接的'href'值的正则表达式的重复问题。 - nikovn
2个回答

4

正则表达式可以在HTML中用于非常特定、简单的情况。例如,如果文本仅包含一个标签,您可以使用"href\\s*=\\s*\"(?<url>.*?)\""来提取URL,例如:

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

该模式将返回:
https://website.com/-id1

这个正则表达式并不复杂。它查找可能带有空格的href=,然后以非贪婪模式(.*?)捕获第一个双引号和下一个双引号之间的任何内容。这个匹配结果被捕获到名为url的命名组中。

如果需要更复杂的功能,情况将变得非常复杂。例如,支持单引号和双引号都需要特殊处理,以避免从单引号开始,但在双引号结束。该字符串可能包含多个同时使用单引号和双引号的<a>标签。

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


我想强烈推荐HtmlAgilityPack。正如有史以来最著名的SO答案所说,混合正则表达式和HTML通常是个坏主意。坚持使用解析库,这些库可以为您提供面向对象的东西来操作。 - pymaxion
谢谢@Panagiotis,感谢您的回答和深入见解。我会研究一下。 - user6745503

1

试试这个:

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列表中。
说明
<a>匹配开始的<a>标记
.*?href= 匹配直到href=
"(.*?)" 匹配并捕获""内的任何内容
.*?> 匹配<a>标记的结尾

谢谢。非常好的见解。你能否给我的问题一个积极的投票,这样我就可以给答案一个积极的投票了。现在,我只有13个声望,我需要2个以上。提前致谢。 - user6745503
谢谢,非常感激 :) - user6745503

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接