4

現在、URL の検証に次の正規表現を使用しています。

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?  (?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|edu|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$

これを改善するために、Web上のどこかからこれを借りました(どこか覚えていません):

^((https?|file|ftp|gopher|news|nntp):\/\/)([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$

ただし、これらのどちらもこの URL を検証できません (有効である必要があります)。

http://somedomain.com/users/1234/images/Staff%20Photos%202008/FirstName%20LastName_1%20(Small).jpg

問題は、%20 と丸括弧 () です。試してみてください。上記の正規表現のいずれかを取得して、他の何かを壊すことなく上記のURLを正しく検証することはできませんでした. 私は派手な正規表現を書いた経験がないので、それも役に立ちません。私が見つけた他のすべてのWeb結果は、次のようなばかげたもので失敗します:

http://www.test..com

助けていただければ幸いです。

4

1 に答える 1

4

同じ正規表現で 2 つのことを検証しています。

  • 整形式 -- 構文的に正しいか?
  • もっともらしい -- プロトコルとトップレベル ドメインはもっともらしいか?

これらの検証を分離すると、実り多い場合があります。この正規表現を使用して、URI が適切な形式であることを確認できます。これは、RFC 3986、Uniform Resource Identifiers (URI): Generic Syntax、付録 B (p. 50) からのものです。

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?

URI がこの正規表現と一致する場合、整形式です。一致グループは、次のようなさまざまな部分を提供します。

scheme    = $2
authority = $4
path      = $5
query     = $7
fragment  = $9

与えられたサンプル URI から何が得られるか見てみましょう。

2 (scheme)   : "http"
4 (authority): "somedomain.com"
5 (path)     : "/users/1234/images/Staff%20Photos%202008/FirstName%20LastName_1%20(Small).jpg"
7 (query)    : nil
9 (fragment) : nil

個々の部分を取得したので、それぞれの妥当性を確認できます。たとえば、機関から TLD を取得するには、次の正規表現を機関に適用します。

\.([^.])$

グループ 1 は、TLD (com、org など) を提供します。これをリストと照合して確認できます。

于 2010-01-18T01:57:42.083 に答える