URL 検証の正規表現を書く
URL 検証の正規表現は、プロトコル、ドメイン、ポート、パス、クエリ、フラグメントを扱う必要があります。実用的なパターンと、URL パーサーを使うべき場面を学びましょう。
- 1
URL は scheme://host:port/path?query#fragment という構造です。実用的な正規表現 ^https?://[a-zA-Z0-9.-]+(:\d+)?(/[^\s]*)?$ は基本構造を検証します。RFC 3986 に完全準拠するには、正規表現ではなく URL パーサーを使ってください。URL にはエンコードされた文字、括弧内の IPv6 アドレス、複雑なクエリ文字列が含まれ得て、正規表現ではうまく扱えません。
- 2 正規表現テスター →
URL のパターンをテストします。単純な ^https?://\S+$ は明らかに URL でないものを捕まえます。中程度の ^https?://[a-zA-Z0-9.-]+(:\d+)?(/[^\s]*)?$ は構造を確認します。有効な URL (http://example.com、https://sub.example.co.uk:8080/path?q=1#frag) と無効な URL (プロトコルなし、スペース、ホストなし) の両方でテストしてください。
- 3 URL パーサー →
完全な検証には、正規表現ではなく URL パーサーを使ってください。パーサーはすべての URL 構成要素、エンコーディング、IPv6、相対 URL を処理します。URL 検証において、正規表現より信頼できます。正規表現は簡単なチェックだけに使い、本番の検証にはパーサーを使ってください。
よくある質問
- 検証には正規表現と URL パーサーのどちらですか?
- 本番の検証には URL パーサー (JavaScript の URL コンストラクター、Python の urllib.parse) を使ってください。正規表現では扱えないすべての RFC 3986 のケース (IPv6、エンコードされた文字、相対 URL) を処理します。正規表現を使ってよいのは、クライアント側の簡単なヒントや、URL 形式を自分で制御している場合だけです。
- http/https を必須にすべきですか?
- Web の URL なら、はい。https を必須にしてください (開発用に http を許可するのは任意です)。一般的な URI なら、他のスキーム (ftp、mailto、file、カスタム) を許可してください。スキームが残りの形式を決めるため、スキームごとに検証します。ユーザー入力には URL パーサーを使い、プロトコルを明示的に確認してください。
このタスクを解決するワークフロー
関連ツール
正規表現テスター
Test regular expressions with match highlighting, capture groups, and replace preview。無料、プライベート、100%クライアントサイド。 ツール
URL パーサー
Parse a URL into its components: protocol, host, path, query, hash, port, username, and password。無料、プライベート、100%クライアントサイド。 ツール
テキスト URL 抽出
Text Extract Urls — 純クライアントサイドツール。プライバシーファースト、サーバー往復なし。 ツール