2008-12-30 5 views
6

Por lo tanto, he estado trabajando en esta expresión regular de nombre de dominio. Hasta ahora, parece recoger nombres de dominio con SLD y TLD (con el ccTLD opcional), pero hay una duplicación de la lista de TLD. ¿Se puede refactorizar más?¿Puedo mejorar esta verificación de expresiones regulares para buscar nombres de dominio válidos?

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]))?$/) 
+2

¿Cuál es su caso de uso para dicha expresión regular que debe mantenerse cuando se crean nuevos dominios? – mark

+0

Dado que todas las respuestas parecen estar dando otras formas de buscar TLDs, propongo que se cambie el nombre de esta pregunta para evitar duplicaciones en el futuro (a menos que la gente empiece a responder la pregunta de refactorización) – TheSoftwareJedi

+0

buena idea, realmente no es un problema de expresiones regulares. – Alnitak

Respuesta

28

Por favor, por favor, no use utilice una expresión regular fija y terriblemente complicada como esta para que coincida con los nombres de dominio conocidos.

La lista de TLD es no estática, particularmente con la ICANN mirando un proceso optimizado para nuevos gTLD. ¡Incluso la lista de ccTLD cambia a veces!

Eche un vistazo a la lista disponible en http://publicsuffix.org/ y escriba algún código que pueda descargar y analizar esa lista.

+0

Acerca de expresiones regulares y sangrado de ojos: http://www.codinghorror.com/blog/archives/001016.html –

+0

eliminó el código nuevamente - cualquier novato puede leer un archivo de la red, ¡y sin el! etc. manejo no es útil. – Alnitak

+0

Supongo que estoy de acuerdo. Hay mejores formas de hacerlo, pero necesito algo que sea increíble para hacer registros/transferencias. ¿Alguna otra recomendación? –

0

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

Y es posible que desee asegurarse de que el nombre empiece por [a-z \ d]. No creo que puedas registrar un dominio que comience con un guion.

+0

No todos los nombres de dominio son dos partes. Un ejemplo de una sola parte: "ck" es el dominio de las islas Cook (prueba con http: // ck o http://www.ck); mi propio dominio es de tres partes (nichesoftware.co.nz) debido a una estructura dentro del .nz TLD. – Bevan

-1

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 ...

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

-1

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

-1

Recomiendo comenzar con las reglas establecidas en RFC 1035, y luego trabajando hacia atrás, pero solo si realmente realmente necesita hacer esto desde el principio. Un patrón de expresión regex de dominio tiene que ser (lo que es discutible por segundo solo a los patrones de expresiones regulares de dirección de correo electrónico) lo más común que existe. Verificaría el sitio regexlib.com y vería lo que otras personas han hecho.

+0

El RFC técnicamente no permite partes de dominio totalmente numéricas, pero en la práctica los registradores y los servidores de nombres los han estado permitiendo durante años. –

4

Descarga esta: http://data.iana.org/TLD/tlds-alpha-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') 

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

+2

Los resultados no son los esperados para dominios como awesomedomain.co.uk - el TLD no se considera .uk es .co.uk Es mejor usar algo como http://publicsuffix.org/ –

+0

@DanEsparza: Y, sin embargo, [publicsuffix.org] (http://publicsuffix.org/) lo registra como "* .uk" y _not_ como "co.uk". –

+0

@DennisWilliamson el '*' en la entrada para '* .uk' significa que cada _sub-domain_ de' .uk' es público _excepto para los que están explícitamente listed_. – Alnitak

Cuestiones relacionadas