Web ページからすべての URL を抽出する .NET 正規表現を探していますが、リンクを指定するさまざまな方法をすべてカバーするのに十分な包括的なものは見つかりませんでした。
副次的な質問:
それらすべてを支配する 1 つの正規表現はありますか? それとも、単純な一連の正規表現を使用して、生の HTML に対して複数のパスを使用する方がよいのでしょうか? (速度 vs 保守性)
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
[編集者注: {1} には、この正規表現では実際の機能はありません。この投稿を参照してください]
RegexBuddy ライブラリから:
最後の文字クラスは、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");
すべての 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
ただし、2 番目のものは、二重引用符を使用するリンクのみを取得します。
URI仕様を見てください。それはあなたを大いに助けることができます。また、パフォーマンスに関する限り、控えめな Web ページでほとんどすべての HTTP リンクを抽出できます。私が控えめに言うとき、ELisp マニュアルのような HTML マニュアルをすべて含む 1 ページを意味するわけではありません。また、パフォーマンスはデリケートなトピックです。私のアドバイスは、パフォーマンスを測定してから、単一の正規表現を使用してすべてのリンクを抽出するか、複数のより単純な正規表現を使用してすべてのリンクを抽出するかを決定することです。
おそらく機能しない正規表現を試して考える時間はありませんが、少なくともこのレベルの醜さになった場合は、正規表現を間違いなく分割する必要があるとコメントしたかったのです。
(?:(?:\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*)
(これはおそらくメールアドレスと一致します)
編集:1つの投稿に収まらないほど厄介です....
https://www.rfc-editor.org/rfc/rfc3986によると
任意のテキスト(HTMLだけでなく)からURLを抽出する
(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
URL?images/scripts/css/etc. のように?
%href="(.["]*)"%