17

Web ページからすべての URL を抽出する .NET 正規表現を探していますが、リンクを指定するさまざまな方法をすべてカバーするのに十分な包括的なものは見つかりませんでした。

副次的な質問:

それらすべてを支配する 1 つの正規表現はありますか? それとも、単純な一連の正規表現を使用して、生の HTML に対して複数のパスを使用する方がよいのでしょうか? (速度 vs 保守性)

4

9 に答える 9

12
((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

これはregexlib.comから取得しました

[編集者注: {1} には、この正規表現では実際の機能はありません。この投稿を参照してください]

于 2008-08-08T17:32:12.253 に答える
8

RegexBuddy ライブラリから:

URL: 全文検索

最後の文字クラスは、URL がテキストの一部である場合、URL の後のカンマやピリオドなどの句読点が URL の一部として解釈されないようにします。

\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]

于 2008-08-17T03:00:34.317 に答える
4

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");
于 2008-08-17T01:08:30.410 に答える
2

すべての 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 番目のものは、二重引用符を使用するリンクのみを取得します。

于 2008-08-08T17:52:29.497 に答える
1

URI仕様を見てください。それはあなたを大いに助けることができます。また、パフォーマンスに関する限り、控えめな Web ページでほとんどすべての HTTP リンクを抽出できます。私が控えめに言うとき、ELisp マニュアルのような HTML マニュアルをすべて含む 1 ページを意味するわけではありません。また、パフォーマンスはデリケートなトピックです。私のアドバイスは、パフォーマンスを測定してから、単一の正規表現を使用してすべてのリンクを抽出するか、複数のより単純な正規表現を使用してすべてのリンクを抽出するかを決定することです。

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

于 2008-08-08T17:29:50.183 に答える
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つの投稿に収まらないほど厄介です....

于 2008-08-08T17:32:01.893 に答える
0

https://www.rfc-editor.org/rfc/rfc3986によると

任意のテキスト(HTMLだけでなく)からURLを抽出する

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
于 2012-09-05T16:14:25.447 に答える
0

URL?images/scripts/css/etc. のように?

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

于 2008-08-08T17:29:57.560 に答える
0

これにより、HTML の作成者が引用符を使用している限り、すべての a タグから URL がキャプチャされます。

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

ここで例を作りました。

于 2008-08-08T17:31:35.157 に答える