用于解析网页链接的正则表达式?

时间:2008-08-08 17:24:19

标签: .net html regex

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

还有一个问题:

是否有一个正则规则来统治所有?或者我最好使用一系列不那么复杂的正则表达式,只使用对原始HTML的mutliple传递? (速度与可维护性)

9 个答案:

答案 0 :(得分:11)

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

我是从regexlib.com

获取的

[编者注:{1}在这个正则表达式中没有实际功能; see this post]

答案 1 :(得分:8)

来自RegexBuddy库的

网址:全文查找

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

  

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

答案 2 :(得分: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");

答案 3 :(得分:2)

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

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

答案 4 :(得分: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

然而,第二个只能获得使用双引号的链接。

答案 5 :(得分:1)

我没有时间去尝试可能无法正常工作的正则表达式,但我想评论一下,你最应该打破你的正则表达式,至少如果它到达this level of ugliness

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

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

编辑:我甚至无法将它放在一个帖子上,这太讨厌......

答案 6 :(得分:0)

URL的?如在images / scripts / css / etc中?

  

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

答案 7 :(得分:0)

只要HTML的作者使用引号:

,这将捕获所有标记中的URL
<a[^>]+href="([^"]+)"[^>]*>

我做了一个例子here

答案 8 :(得分:0)

根据http://tools.ietf.org/html/rfc3986

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

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)