43

正規表現を使用して、プレーン テキスト URL をクリック可能なリンクに変換しています。

@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@

ただし、テキストの本文では、URL が 1 行に 1 つずつ列挙され、最後にセミコロンが付いている場合があります。実際の URL には「;」は含まれません。

http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=275;
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=123;
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=124

URL にセミコロン (;) を含めることは許可されていますか? それとも、セミコロンを URL の終わりのマーカーと見なすことができますか? それは私の正規表現にどのように適合しますか?

4

7 に答える 7

48

セミコロンは予約されており、特別な目的のためにのみ使用する必要があります (スキームによって異なります) 。

セクション 2.2:

多くの URL スキームは、特定の文字を特別な意味のために予約しています。URL のスキーム固有の部分に現れる文字には、指定されたセマンティクスがあります。オクテットに対応する文字がスキームで予約されている場合、オクテットをエンコードする必要があります。文字「;」、「/」、「?」、「:」、「@」、「=」、および「&」は、スキーム内で特別な意味のために予約されている文字です。スキーム内で他の文字を予約することはできません。

于 2009-07-24T14:26:21.083 に答える
31

W3C は、CGI プログラムが を受け入れることを奨励しています。クエリ文字列の & と同様に (つまり?name=fred&age=50、 and?name=fred;age=50を同じように扱います)。これは、& を & としてエンコードする必要があるためです。HTML では; しません。

于 2009-07-24T15:05:30.553 に答える
13

セミコロンは有効な URI 文字です。サブデリミタ カテゴリに属します: http://www.ietf.org/rfc/rfc3986.txt

ただし、仕様では、セミカラーが特定のURI に対して正当であるかどうかは、その URI のスキームまたはプロデューサーに依存すると述べています。したがって、これらのリンクを使用するサイトでセミコロンが許可されていない場合、その特定のケースでは有効ではありません。

于 2009-07-24T14:40:07.690 に答える
9

技術的には、セミコロンは URL 文字列の有効なサブ区切り文字です。http://www.ietf.org/rfc/rfc3986.txtを含む多くのソース資料が上に引用されています。

また、正当な目的で使用する人もいますが、その使用法はサイトによって定義される必要があるため、その使用法はサイト固有 (つまり、そのサイトでの使用のみ) である可能性があります。

ただし、現実の世界では、URL でのセミコロンの主な用途は、ウィルスまたはフィッシング URL を正当な URL の背後に隠すことです。

たとえば、次のリンクを含む電子メールを誰かに送信します。

http://www.yahoo.com/junk/nonsense;0200.0xfe.0x37.0xbf/malicious_file/

Yahoo! リンク (www.yahoo.com/junk/nonsense) は無視されます。これは、正当な (つまり、適切に形成された) にもかかわらず、そのようなページが存在しないためです。しかし、おそらく 2 番目のリンク (0200.0xfe.0x37.0xbf/malicious_file/) が存在し*、ユーザーは Malicious_file ページに誘導されます。すぐに企業の IT マネージャーがレポートを受け取り、ピンクの伝票を受け取る可能性があります。

そして、すべての否定論者が危険を冒す前に、これはまさに新しい Facebook フィッシング問題がどのように機能するかです. 名前はいつものように有罪を保護するために変更されています。

※私の知る限り、そのようなページは実際には存在しません。表示されているリンクは、この説明のみを目的としています。

于 2010-04-12T14:54:28.240 に答える
6

http://www.ietf.org/rfc/rfc3986.txtには、URL と、エンコードされていない形式で表示される可能性のある文字が記載されています。セミコロンを含む URL がブラウザーで適切に機能することを考えると、コードはセミコロンをサポートする必要があります。

于 2009-07-24T14:25:41.490 に答える
4

はい、セミコロンは URL で有効です。ただし、比較的構造化されていない散文からそれらを抜き出している場合は、URL の末尾にあるセミコロンが文の句読点を意味していると想定するのがおそらく安全です。同じことが、ピリオド、疑問符、引用符などの他の句読点文字にも当てはまります。

明示的なプロトコルを使用した URL のみに関心がhttp[s]あり、正規表現が後読みをサポートしている場合は、次の正規表現で十分です。

https?://[\w!#$%&'()*+,./:;=?@\[\]-]+(?<![!,.?;:"'()-])

プロトコルの後は、構造をまったく気にせずに、URL で有効な可能性のある 1 つまたは複数の文字に単純に一致します。しかしその後、最後の文字が文の句読点でなくなるまで、必要なだけ位置を後退させます。

于 2010-02-16T08:48:31.837 に答える
0

RFC を引用することは、この質問に答える上でそれほど役に立ちません。なぜなら、URL にセミコロン (およびコンマ) が含まれていることに遭遇するからです。セミコロンとコンマを処理しない Regex があり、NutshellMail の一部のユーザーは、それらを含む URL が実際に実際に存在するため、不満を漏らしていました。Facebook または Twitter で「;」を含むダミー URL を作成してみてください。これら 2 つのサービスが完全な URL を適切にエンコードしていることがわかります。

使用していた正規表現を次のパターンに置き換えました (動作することをテストしました)。

 string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";

この Regex はhttp://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/からのものです(わずかに変更されています)。

于 2010-02-13T02:49:35.253 に答える