所以,我一直在研究这个域名正则表达式。到目前为止,它似乎使用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]))?$/)发布于 2008-12-30 19:08:53
请,请,请不要使用像这样一个固定的、极其复杂的正则表达式来匹配已知域名。
顶级域名的列表并不是静态的,特别是ICANN正在寻找新通用顶级域名的简化流程。甚至ccTLD的列表有时也会发生变化!
看看http://publicsuffix.org/提供的列表,然后编写一些能够下载和解析该列表的代码。
发布于 2008-12-30 21:02:27
下载: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')您可以将domain-list-building从validate函数中剔除,以提高性能。
发布于 2008-12-30 10:34:45
我对域名的了解可能还不够。但是为什么像"foo.info.com“这样的域名是匹配的呢?在这种情况下,域名似乎是"info.com“。
你可能想要确保域名以a-z\d开头。我不认为你可以注册一个以破折号开头的域名?
https://stackoverflow.com/questions/399932
复制相似问题