Puedo mejorar esta comprobación de expresiones regulares para los nombres de dominio válido?

StackOverflow https://stackoverflow.com/questions/399932

  •  29-08-2019
  •  | 
  •  

Pregunta

Por lo tanto, he estado trabajando en este nombre de dominio de expresiones regulares. Hasta el momento, parece que recoger los nombres de dominio con los SLD y dominios de nivel superior (con el ccTLD opcional), pero existe una duplicación de la lista de TLD. ¿Puede esto ser rediseñado más lejos?

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

Solución

Por favor, por favor, por favor no utiliza una expresión regular fijo y horriblemente complicado como este para que coincida con los nombres de dominio conocidos.

La lista de dominios de nivel superior es no estática, sobre todo con la ICANN mirando un proceso simplificado para los nuevos gTLD. Incluso la lista de ccTLD cambia a veces!

Tener un vistazo a la lista disponible de http://publicsuffix.org/ y escribir un código que es capaz de descargar y analizar esa lista en su lugar.

Otros consejos

Descargar este: http://data.iana.org/ TLD / tlds-alfa-by-domain.txt

Ejemplo de uso (en 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')

Puede factorizar el dominio de la lista de la capacidad de la función de validación para mejorar el rendimiento.

No sé lo suficiente sobre los nombres de dominio probablemente. Pero ¿por qué se corresponde dominios como "foo.info.com"? Parece que el nombre de dominio es "info.com" en ese caso particular.

Y es posible que desee asegurarse de que el nombre comienza con [a-z \ d]. Creo que no se puede registrar un dominio que comienza con un guión?

Bueno como ya lo tienen por escrito, la parte TLD es equivalente pero más largo que (\.<tldpart>){1,2}, pero estoy seguro de que podría fijarse para la duplicación ...

editar: yech, no, sería posible, pero esencialmente una lista fuerza bruta muy lento para manejar las duplicaciones, creo. Más simple y más rápido para poner la posible TLD y SLD + pares de países en una gran HashMap y comprobar la subcadena contra de eso.

Yo recomiendo empezar con las normas establecidas en RFC 1035 , y a continuación, trabajando hacia atrás - pero sólo si realmente realmente realmente necesita hacer esto desde el principio. Un patrón de expresión de dominio tiene que ser lo más común (discutible en segundo lugar solamente a patrones de dirección de correo electrónico de expresiones regulares) por ahí. Me gustaría visitar el sitio regexlib.com y navegar a través de lo que otras personas han hecho.

Se puede construir hasta la expresión regular como una cadena y luego hacer Regexp.new (cadena).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top