私は、有効なドメイン名のこの正規表現チェックを向上させることができますか?
質問
だから、私は、このドメイン名の正規表現に取り組んできました。これまでのところ、(オプションのccTLD付き)のSLDとのTLDを持つドメイン名をピックアップするようだが、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]))?$/)
解決
、のの既知のドメイン名を一致させるために、このような固定と恐ろしく複雑な正規表現を使用しないでくださいしてくださいしてください。
のTLDのリストは、特にICANNが新gTLDのための合理化のプロセスを見ていると、のないの静的です。さえのccTLDのリストは時々変わる!
http://publicsuffix.org/するから利用可能なリストを見てくださいとのことだいくつかのコードを書きます代わりにそのリストをダウンロードして解析します。
他のヒント
このダウンロード: http://data.iana.org/ TLD / TLDのアルファ・バイ・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')
あなたは、パフォーマンスを支援する検証機能のうち、ドメイン・リスト・建物を考慮することができます。
私はおそらくドメイン名について十分に知りません。しかし、なぜ「foo.info.com」などのドメインが一致していますか?ドメイン名がその特定のケースでは「info.com」であると思われます。
そして、あなたは名前が[-Zの\ dの]で始まることを確認したい場合があります。私はあなたがダッシュで始まるドメインを登録することができると思いませんか?
あなたはそれが書かれているだけでなく、TLDの部分は同等けど(\.<tldpart>){1,2}
よりも長いですが、私はそれが重複のために固定することができ確信している...
編集:yech、いや、それは可能でしょうが、基本的に非常に遅いブルートフォースリストは、私が思うの重複を処理します。簡単かつ高速化は大きなハッシュマップで可能TLDとSLD +国のペアを置き、そのに対する部分文字列をチェックします。
私は RFC 1035 のにレイアウトルールで始まり、そしてお勧めしますその後、後方作業 - しかし、あなたは本当に、本当に、本当に最初からこれを実行する必要がある場合のみ。ドメインの正規表現パターンがそこに最も一般的なもの(メールアドレスのみの正規表現パターンに議論の余地秒)に持っています。私は、サイト regexlib.com にチェックアウトして、他の人々がやっていることをブラウズするでしょう。
あなたは、文字列として正規表現を構築し、その後Regexp.new(文字列)を行うことができます。