我正在寻找一个.NET正则表达式从网页中提取所有URL,但是没有找到一个足够全面的URL来涵盖指定链接的所有不同方法。
还有一个问题:
是否有一个正则表达式来统治它们? 或者我最好使用一系列不那么复杂的正则表达式,只使用对原始HTML的mutliple传递? (速度与可维护性)
1
| ((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+) |
我从regexlib.com上拿了这个
[编者注:{1}在这个正则表达式中没有实际功能;看这篇文章]
来自RegexBuddy库:
网址:全文查找
最后一个字符类确保如果URL是某些文本的一部分,则URL后的标点符号(如逗号或句点)不会被解释为URL的一部分。
\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]
使用Html Agility Pack,您可以使用:
1 2 3 4 5 6 7
| 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
1
| (["'])(mailto:|http:).*?\1 |
由href或src调用的所有链接,包括相对链接。
1 2 3 4 5
| #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手册。表演也是一个棘手的话题。我的建议是衡量你的表现,然后决定你是要使用一个正则表达式还是使用多个更简单的正则表达式来提取所有链接。
http://gbiv.com/protocols/uri/rfc/rfc3986.html
我没有时间去尝试一个可能不起作用的正则表达式,但是我想评论一下,你最应该打破你的正则表达式,至少如果它达到这种丑陋程度:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| (?:(?:
)?[ \t])*(?:(?:(?:[^()<>@,;:\".\[\] \000-\031]+(?:(?:(?:
)?[ \t]
)+|\Z|(?=[\["()<>@,;:\".\[\]]))|"(?:[^"
\\]|\\.|(?:(?:
)?[ \t]))*"(?:(?:
)?[ \t])*)(?:\.(?:(?:
)?[ \t])*(?:[^()<>@,;:\".\[\] \000-\031]+(?:(?:(
?:
)?[ \t])+|\Z|(?=[\["()<>@,;:\".\[\]]))|"(?:[^"
\\]|\\.|(?:(?:
)?[
\t]))*"(?:(?:
)?[ \t])*))*@(?:(?:
)?[ \t])*(?:[^()<>@,;:\".\[\] \000-\0
....*SNIP*....
*))*@(?:(?:
)?[ \t])*(?:[^()<>@,;:\".\[\] \000-\031]+(?:(?:(?:
)?[ \t])
+|\Z|(?=[\["()<>@,;:\".\[\]]))|\[([^\[\]
\\]|\\.)*\](?:(?:
)?[ \t])*)(?:\
.(?:(?:
)?[ \t])*(?:[^()<>@,;:\".\[\] \000-\031]+(?:(?:(?:
)?[ \t])+|\Z
|(?=[\["()<>@,;:\".\[\]]))|\[([^\[\]
\\]|\\.)*\](?:(?:
)?[ \t])*))*\>(?:(
?:
)?[ \t])*))*)?;\s*) |
(这应该与电子邮件地址匹配)
编辑:我甚至不能把它放在一个帖子上它是如此令人讨厌....
根据http://tools.ietf.org/html/rfc3986
从任何文本中提取网址(不仅仅是HTML)
1
| (http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+) |
只要HTML的作者使用引号,这将捕获所有标记中的URL:
我在这里举了一个例子。
URL的?如在images / scripts / css / etc中?
%href="(.["]*)"%