题
所以,我一直在做这个域名正则表达式。到目前为止,似乎挑了的SLD和顶级域名(使用可选的国家代码顶级域名)域名,但存在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精简过程。即使国家代码顶级域的名单,有时会改变!
看一看清单可以从 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”在该特定情况下。
和您可能希望确保名称开头[A-Z \ d]。我不认为你可以注册以破折号开头的域名?
以及你有它写的,TLD部分相当于但是比(\.<tldpart>){1,2}
长,但我敢肯定,它可以固定重复...
编辑:yech,不,这将是可能的,但本质上是一个非常缓慢的蛮力列表来处理我觉得重复。更简单,更快地把可能的TLD和SLD +国家对在一个大HashMap和核对的字符串。
我建议开始href="http://www.faqs.org/rfcs/rfc1035.html" rel="nofollow noreferrer"> RFC 1035 在 regexlib.com 并通过已经做了其他人浏览。
可以建立正则表达式作为一个字符串,然后执行Regexp.new(字符串)。
不隶属于 StackOverflow