質問
Web ページからすべての URL を抽出する .NET 正規表現を探していますが、リンクを指定するさまざまな方法をすべてカバーできるほど包括的なものは見つかりませんでした。
そして余談ですが:
ありますか 1 つの正規表現ですべてを制御する?それとも、複雑ではない一連の正規表現を使用し、生の HTML に対して複数のパスを使用する方が良いでしょうか?(速度 vs.メンテナンス性)
解決
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
私はこれをから取り出しました regexlib.com
[編集者注:この正規表現では、{1} には実際の機能はありません。 この投稿を参照してください]
他のヒント
RegexBuddy ライブラリから:
URL:全文で検索
最後の文字クラスは、URL がテキストの一部である場合、URL の後のカンマやピリオドなどの句読点が URL の一部として解釈されないようにします。
\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]
と HTML アジリティ パック, 、次を使用できます。
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の仕様を見てください。それはとても役に立つかもしれません。パフォーマンスに関しては、控えめな Web ページ内のすべての HTTP リンクをほぼ抽出できます。私が「控えめ」と言うとき、ELisp マニュアルのような HTML マニュアルをすべて含む 1 ページを意味するわけではありません。パフォーマンスもデリケートな話題です。私のアドバイスは、パフォーマンスを測定してから、単一の正規表現を使用してすべてのリンクを抽出するか、複数のより単純な正規表現を使用して抽出するかを決定することです。
すべての 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 番目の方法では、二重引用符を使用したリンクのみが取得されます。
おそらく機能しない正規表現を考えてみる時間はありませんが、少なくとも機能しない場合には正規表現を分割する必要があるとコメントしたかったのです。 このレベルの醜さ:
(?:(?:\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つの記事に収まりきらないくらいめんどくさいです…。
URLは?画像/スクリプト/CSSなどのように?
%href="(.["]*)"%
によると http://tools.ietf.org/html/rfc3986
HTML だけでなく、あらゆるテキストから URL を抽出する
(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)