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

psed 发布于 2018-03-08 .net 最后更新 2018-03-08 01:08 533 浏览

我正在寻找.NET正则表达式从网页中提取所有网址,但还没有找到足够全面的网址来涵盖您可以指定链接的所有不同方式。 还有一个问题: 是否有一个正则表达式来统治他们?或者我最好使用一系列不太复杂的正则表达式,并使用原始HTML的多重传递? (速度与可维护性)

已邀请:

out

赞同来自:

看看URI规范。这可以帮助你很多。就性能而言,您几乎可以在适度的网页中提取所有HTTP链接。当我说谦虚时,我绝对不意味着一个页面都包含像ELisp手册那样的HTML手册。性能也是一个敏感话题。我的建议是衡量你的表现,然后决定是否要使用一个正则表达式或多个更简单的正则表达式来提取所有链接。 http://gbiv.com/protocols/uri/rfc/rfc3986.html

inemo

赞同来自:

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

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

set

赞同来自:

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

<a[^>]+href="([^"]+)"[^>]*>
我做了一个例子here

ddolor

赞同来自:

我没有时间尝试考虑可能无法正常工作的正则表达式,但我想评论一下,如果出现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*)
(这应该与电子邮件地址匹配) 编辑:我甚至不能适应它的一个帖子它是如此讨厌....

pporro

赞同来自:

((的mailto:|(新闻|(HT | F)TP(S))://){1} \ S +?) 我从regexlib.com中取得了这个 [编者注:{1}在这个正则表达式中没有实际的功能; see this post]

uet

赞同来自:

所有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
然而,第二个只会让你看到使用双引号的链接。

vvel

赞同来自:

借助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");

guozao

赞同来自:

来自RegexBuddy图书馆:

网址:以全文查找 最终的字符类可以确保如果URL是某些文本的一部分,则URL之后的标点(例如逗号或句号)不会被解释为URL的一部分。
\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]

west

赞同来自:

根据http://tools.ietf.org/html/rfc3986 从任何文本中提取网址(不仅仅是HTML)

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