1

文字列が Web サイトのアドレスまたはその Web サイトの特定のページへの参照であるかどうかを検証できる正規表現を探しています。

したがって、次のように一致します。

http://google.com
ftp://google.com
http://google.com/
http://lots.of.subdomains.google.com

だがしかし:

http://google.com/search.whatever
ftp://google.com/search.whatever
http://lots.of.subdomains.google.com/search.whatever

何か案は?/URL の最後に を許可する方法がよくわかりません。

4

3 に答える 3

6

これを試して:

(http|ftp|https)://([a-zA-Z0-9\-\.]+)/?
于 2008-10-10T02:38:28.737 に答える
5

これは、仕様に基づく、完全な URI 検証パターンの短縮バージョンです。これを書いたのは、Web 上で見つけたどの検証パターンにも含まれていない多くの文字が仕様​​で許可されているためです。ユーザー/パス (および 2 番目のパターンでは、パスとクエリ文字列) が、思ったよりもはるかに寛大であることがわかります。

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#                       domain segments AND
)[a-z]{2}[a-z0-9-]*[a-z0-9](?#                              top level domain OR
)|(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5]\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))\/?$/i

もう少し読みやすくするために時間をかけたので、ここに完全なパターンを示します。

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#                       domain segments AND
)[a-z]{2}[a-z0-9-]*[a-z0-9](?#                              top level domain OR
)|(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5]\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*(?# path
)(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)(?#      query string
)?)?)?(?#                                                   path and query string optional
)(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?(?#      fragment
)$/i

一部の (すべて?) JavaScript 実装は、正規表現でのコメントをサポートしていないことに注意してください。

于 2008-10-10T06:44:35.013 に答える
2

ジェレミーによる素晴らしい答え。照合に使用している正規表現の方言に応じて、( のような URL の照合を避けるためにhttp://example.com/bin/cgi?returnUrl=http://google.com) 式全体をアンカーでラップし、有効なプロトコルとドメイン名の文字を一般化することができます。

^\w+://(\w+\.)+\w+/?$
于 2008-10-10T03:45:12.440 に答える