Pergunta

Então, eu tenho vindo a trabalhar sobre este nome de domínio de expressão regular. Até agora, ele parece pegar nomes de domínio com SLDs e TLDs (com o ccTLD opcional), mas não há duplicação do TLD listagem. isso pode ser reformulado mais longe?

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]))?$/)
Foi útil?

Solução

Por favor, por favor, por favor não usar um regex fixa e terrivelmente complicado como este para corresponder para nomes de domínio conhecidos.

A lista de TLDs é não estática, particularmente com a ICANN olhando para um processo simplificado para novos gTLDs. Mesmo a lista de ccTLDs muda às vezes!

Tenha um olhar para a lista disponível de http://publicsuffix.org/ e escrever algum código que é capaz de faça o download e analisar essa lista em seu lugar.

Outras dicas

Faça o download deste: http://data.iana.org/ TLD / tlds-alfa-by-domain.txt

Exemplo de utilização (em 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')

Você pode levar o domínio de lista-edifício para fora da função de validar o desempenho de ajuda.

Eu não sei o suficiente sobre nomes de domínio provavelmente. Mas porque é que domínios como "foo.info.com" combinado? Parece que o nome de domínio é "info.com" nesse caso particular.

E você pode querer certificar-se o nome começa com [a-z \ d]. Eu não acho que você pode registrar um domínio que começa com um traço?

Bem, como você tê-lo escrito, a parte TLD é equivalente, mas mais do que (\.<tldpart>){1,2} mas tenho certeza de que poderia ser fixado para a duplicação ...

edit: yech, não, seria possível, mas essencialmente uma lista força bruta muito lento para lidar com as duplicações que eu penso. Mais simples e mais rápido para colocar a possível TLD e pares de países SLD + em uma grande hashmap e verificar a substring contra isso.

Eu recomendo começar com as regras estabelecidas no RFC 1035 , e depois para trás trabalhar - mas só se você realmente realmente realmente precisa fazer isso a partir do zero. Um padrão regex domínio tem que ser (segunda discutível apenas para padrões de regex endereço de email) a coisa mais comum lá fora. Gostaria de verificar o site regexlib.com e percorrer o que as outras pessoas têm feito.

Você pode construir a regex como uma string e depois fazer Regexp.new (string).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top