正则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和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._\\-~]+)