我正在寻找一个 .NET 正则表达式从网页中提取所有 URL,但还没有找到一个足够全面来涵盖您可以指定链接的所有不同方式。
还有一个附带问题:
是否有一个正则表达式来统治它们?还是我最好使用一系列不太复杂的正则表达式,只对原始 HTML 使用多重传递?(速度与可维护性)
来自 RegexBuddy 库:
最后的字符类确保如果 URL 是某些文本的一部分,则 URL 后的逗号或句号等标点符号不会被解释为 URL 的一部分。
\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]
使用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");
所有 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
但是,第二个只会为您提供使用双引号的链接。
查看 URI 规范。这可以帮助你很多。就性能而言,您几乎可以在一个普通网页中提取所有 HTTP 链接。当我说谦虚时,我绝对不是指像 ELisp 手册那样包含所有 HTML 手册的一页。性能也是一个敏感的话题。我的建议是衡量你的表现,然后决定是使用一个正则表达式还是使用多个更简单的正则表达式来提取所有链接。
我没有时间尝试考虑一个可能不起作用的正则表达式,但我想评论说你绝对应该打破你的正则表达式,至少如果它达到这种丑陋程度:
(?:(?:\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*)
(这应该与电子邮件地址匹配)
编辑:我什至不能把它放在一个帖子上,太讨厌了....
网址?如图像/脚本/css/等?
%href="(.["]*)"%
根据https://www.rfc-editor.org/rfc/rfc3986
从任何文本(不仅是 HTML)中提取 url
(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)