starbucks.com、apple.com、microsoft.comなどの以下のドメインを検証する状況があります。指定された正規表現のほとんどが正しく機能していません。私の状況でのドメイン検証に最適な正規表現は何でしょうか?
よろしくお願いします!
starbucks.com、apple.com、microsoft.comなどの以下のドメインを検証する状況があります。指定された正規表現のほとんどが正しく機能していません。私の状況でのドメイン検証に最適な正規表現は何でしょうか?
よろしくお願いします!
免責事項:「有効なドメイン」を定義するルールは、移動するターゲットを構成することに注意してください。以下の回答は、「古い学校」のDNSルール(ASCII文字のみを使用)のみを扱い、国際ドメイン(RFC3490に規定されている)を処理しようとはしていません。また、すぐに多くの新しいトップレベルドメイン(TLD)がポップアップするため、以下のソリューションを定期的に更新する必要があることにも注意してください(有効なTLDの現在のリストについてはIANA.ORGを参照してください)。
関連するインターネットの推奨事項(RFC3986セクション2.2、RFC1034セクション3.5およびRFC1123セクション2.1を参照)によると、サブドメイン(DNSドメインホスト名の一部)は、いくつかの要件を満たす必要があります。
[A-Za-z]
または数字[0-9]
)で開始および終了する必要があります。これらの要件を満たすサブドメイン部分の式フラグメントは次のとおりです。
(?:[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9]|[A-Za-z0-9])
この式では、1文字しかないサブドメインの特殊なケースを処理するために、2つの選択肢を持つグループが必要であることに注意してください。また、この式フラグメントは単独で使用しないでください。DNSホスト名の次の式に示すように、より大きなコンテキストで境界条件を組み込む必要があります。
名前付きホスト(IPアドレスではない)は、追加の要件を満たす必要があります。
これを念頭に置いて、ここでコメント化された正規表現(C#構文)は、DNSホスト名を疑似検証します:(これには、サブドメインの上記の式の変更バージョンが組み込まれ、これにもコメントが追加されることに注意してください)。
if (Regex.IsMatch(text, @" # Rev:2013-03-26
# Match DNS host domain having one or more subdomains.
# Top level domain subset taken from IANA.ORG. See:
# http://data.iana.org/TLD/tlds-alpha-by-domain.txt
^ # Anchor to start of string.
(?!.{256}) # Whole domain must be 255 or less.
(?: # Group for one or more sub-domains.
[a-z0-9] # Either subdomain length from 2-63.
[a-z0-9-]{0,61} # Middle part may have dashes.
[a-z0-9] # Starts and ends with alphanum.
\. # Dot separates subdomains.
| [a-z0-9] # or subdomain length == 1 char.
\. # Dot separates subdomains.
)+ # One or more sub-domains.
(?: # Top level domain alternatives.
[a-z]{2} # Either any 2 char country code,
| AERO|ARPA|ASIA|BIZ|CAT|COM|COOP|EDU| # or TLD
GOV|INFO|INT|JOBS|MIL|MOBI|MUSEUM| # from list.
NAME|NET|ORG|POST|PRO|TEL|TRAVEL|XXX # IANA.ORG
) # End group of TLD alternatives.
$ # Anchor to end of string.",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
{
// Valid named DNS host (domain).
} else {
// NOT a valid named DNS host.
}
この表現は完全ではないことに注意してください。1つ以上のサブドメインが必要ですが、技術的には、ホストはサブドメインを持たないTLDで構成できます(ただし、これはまれです)。また、2文字の国別コードTLDを明示的に記述していません。これは、任意の2文字を許可するだけです。また、さまざまなTLDもリストされていませんXN--XXXXX
。このソリューションでは、まだ完全に実装されておらず、普遍的に受け入れられる国際ドメイン名も考慮されていません。
他のURIコンポーネントの検証の詳細については、私がしばらく前に書いた記事「正規表現URI検証」を参照してください。RFC3986で定義されているさまざまなURIコンポーネントすべてに対して、さまざまな言語のコードスニペットを提供します。
よろしくお願いします!
^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix
これは受け入れます:
apple.com
等々...