用于解析网页链接的正则表达式?
时间:2020-03-05 18:38:39 来源:igfitidea点击:
我正在寻找一个.NET正则表达式来提取网页中的所有URL,但是还没有找到一个足够全面的方法来涵盖我们可以指定链接的所有不同方式。
还有一个问题:
是否有一个正则表达式可以统治所有人?还是我最好使用一系列不那么复杂的正则表达式,而只对原始HTML使用多行传递? (速度与可维护性)
解决方案
回答
查看URI规范。那可以帮到你很多。就性能而言,我们几乎可以在适当的网页中提取所有HTTP链接。当我说"谦虚"时,我绝对不是要像ELisp手册那样包含所有包含HTML手册的页面。性能也是一个敏感的话题。我的建议是测量性能,然后决定是要使用一个正则表达式还是使用多个更简单的正则表达式来提取所有链接。
http://gbiv.com/protocols/uri/rfc/rfc3986.html
回答
URL的?如图像/脚本/ CSS /等?
%href="(.["]*)"%
回答
只要使用引号的HTML的作者都将捕获所有标记的URL:
<a[^>]+href="([^"]+)"[^>]*>
我在这里做了一个例子。
回答
我没有时间去尝试可能不起作用的正则表达式,但是我想评论一下,我们至少应该将正则表达式分解,至少要使其达到这种丑陋的程度:
(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\".\[\]((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)0-1]+(?:(?:(?:\r\n)?[ \t] )+|\Z|(?=[\["()<>@,;:\".\[\]]))|"(?:[^\"\r\]|\.|(?:(?:\r\n)?[ \t]))*"(?:(?: \r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\".\[\](["'])(mailto:|http:).*?0-1]+(?:(?:( ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\".\[\]]))|"(?:[^\"\r\]|\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\".\[\]#Matches things in single or double quotes, but not the quotes themselves (?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=) #Maches thing in either double or single quotes, including the quotes. (["'])((?<=href=")|(?<=src=")).*?0-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");....*SNIP*.... *))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\".\[\]\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]0-1]+(?:(?:(?:\r\n)?[ \t]) +|\Z|(?=[\["()<>@,;:\".\[\]]))|\[([^\[\]\r\]|\.)*\](?:(?:\r\n)?[ \t])*)(?:\ .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\".\[\] ##代码##0-1]+(?:(?:(?:\r\n)?[ \t])+|\Z |(?=[\["()<>@,;:\".\[\]]))|\[([^\[\]\r\]|\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:( ?:\r\n)?[ \t])*))*)?;\s*)
(这应该与电子邮件地址匹配)
编辑:我什至不能把它放在一个如此讨厌的帖子上。
回答
##代码##我是从regexlib.com上拿来的
[编者注:{1}在此正则表达式中没有实际功能;看到这个职位]
回答
所有HTTP和MAILTO
##代码##href或者src调用的所有链接(包括相对链接)。
##代码##但是,第二个链接只会使我们使用双引号的链接。
回答
使用HTML Agility Pack,我们可以使用:
##代码##回答
来自RegexBuddy库:
网址:全文查找
最终的字符类确保如果URL是某些文本的一部分,则URL之后的标点符号(例如逗号或者句号)不会被解释为URL的一部分。
##代码##