正则expression式从网页parsing链接?

我正在寻找一个.NET正则expression式从网页中提取所有的url,但还没有find一个足够全面的覆盖所有不同的方式,你可以指定一个链接。

还有一个方面的问题:

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

((的mailto:|(新闻|(HT | F)TP(S))://){1} \ S +?)

我从regexlib.com拿走了这个

[编者注:{1}在这个正则expression式中没有实际的function; 看这个post ]

来自RegexBuddy的图书馆:

url:全文查找

最后的字符类可以确保如果某个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"); 

看看URI规范。 这可以帮助你很多。 就性能而言,你几乎可以在一个适中的网页中提取所有的HTTP链接。 当我说谦虚的时候,我绝对不是指所有包含像ELISP手册那样的HTML手册的页面。 性能也是一个敏感的话题。 我的build议是衡量你的performance,然后决定是否要使用一个正则expression式或多个简单的正则expression式来提取所有的链接。

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

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

第二个只会让你的链接,使用双引号,但是。

我没有时间去思考一个可能不起作用的正则expression式,但是我想评论一下,你应该把你的正则expression式分解出来,至less如果它达到了这个丑陋的级别 :

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

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

编辑:我甚至不能适应它的一个post是如此讨厌….

只要HTML的作者使用了引号,就可以捕获所有标签中的URL:

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

我在这里做了一个例子。

URL的? 如在图像/脚本/ CSS /等?

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

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

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

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