7

それで、私はこのドメイン名の正規表現に取り組んできました。これまでのところ、SLD と TLD (オプションの ccTLD を使用) でドメイン名をピックアップしているようですが、TLD のリストに重複があります。これをさらにリファクタリングできますか?

params[:domain_name].downcase.strip.match(/^[a-z0-9\-]{2,63}
\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|
(m[acdghklmnopqrstuvwxyz]|me|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])
(\.((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|
(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|
(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|
(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|
m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|
(n[acefgilopruz]|name|net)|(om|org)|
(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|
(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))?$/)
4

6 に答える 6

28

既知のドメイン名を照合するために、このような固定された恐ろしく複雑な正規表現を使用しないでください。

TLD のリストは、特に ICANN が新しい gTLD の合理化されたプロセスを検討しているため、静的ではありません。ccTLD のリストでさえ時々変更されます!

http://publicsuffix.org/から入手できるリストを見て、代わりにそのリストをダウンロードして解析できるコードを書いてください。

于 2008-12-30T19:08:53.100 に答える
4

これをダウンロードしてください: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

使用例 (Python):

import re
def validate(domain):
    valid_domains = [ line.upper().replace('.', '\.').strip() 
                      for line in open('domains.txt') 
                      if line[0] != '#' ]
    r = re.compile(r'^[A-Z0-9\-]{2,63}\.(%s)$' % ('|'.join(valid_domains),))
    return True if r.match(domain.upper()) else False


print validate('stackoverflow.com')
print validate('omnom.nom')

パフォーマンスを向上させるために、検証関数からドメイン リストの構築を除外することができます。

于 2008-12-30T21:02:27.380 に答える
0

私はおそらくドメイン名について十分に知りません。しかし、なぜ「foo.info.com」のようなドメインが一致するのでしょうか? その場合のドメイン名は「info.com」のようです。

また、名前が [az\d] で始まることを確認することもできます。ダッシュで始まるドメインを登録できないと思いますか?

于 2008-12-30T10:34:45.417 に答える
-1

RFC 1035に規定されているルールから始めて、逆方向に作業することをお勧めします。ただし、これを本当に最初から行う必要がある場合に限ります。ドメインの正規表現パターンは、(電子メールアドレスの正規表現パターンに次ぐ議論の余地がある)最も一般的なものでなければなりません。私はサイトregexlib.comをチェックして、他の人々が行ったことを閲覧します。

于 2008-12-30T19:55:15.940 に答える
-1

あなたが書いたように、TLD部分は同等ですが、それよりも長いです(\.<tldpart>){1,2}が、重複のために修正できると確信しています...

編集:ええ、いいえ、それは可能ですが、本質的に、重複を処理するための非常に遅い力ずくのリストだと思います。可能性のある TLD と SLD + 国のペアを大きなハッシュマップに配置し、それに対して部分文字列をチェックする方が簡単で高速です。

于 2008-12-30T10:36:42.587 に答える
-1

正規表現を文字列として作成してから、Regexp.new(string) を実行できます。

于 2008-12-30T10:38:54.360 に答える