17

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

还有一个附带问题:

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

4

9 回答 9

12
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

我从regexlib.com拿了这个

[编者注:{1} 在这个正则表达式中没有真正的功能;看到这个帖子]

于 2008-08-08T17:32:12.253 回答
8

来自 RegexBuddy 库:

网址:全文查找

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

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

于 2008-08-17T03:00:34.317 回答
4

使用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");
于 2008-08-17T01:08:30.410 回答
2

所有 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

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

于 2008-08-08T17:52:29.497 回答
1

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

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

于 2008-08-08T17:29:50.183 回答
1

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

(?:(?:\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*)

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

编辑:我什至不能把它放在一个帖子上,太讨厌了....

于 2008-08-08T17:32:01.893 回答
0

网址?如图像/脚本/css/等?

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

于 2008-08-08T17:29:57.560 回答
0

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

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

我在这里做了一个例子。

于 2008-08-08T17:31:35.157 回答
0

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

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

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
于 2012-09-05T16:14:25.447 回答