2008-12-30 13 views
6

Donc, j'ai travaillé sur cette expression régulière de nom de domaine. Jusqu'à présent, il semble s'agir de noms de domaine avec des SLD et des TLD (avec le ccTLD optionnel), mais il y a une duplication de la liste de TLD. Cela peut-il être réécrit plus loin?Puis-je améliorer cette vérification des expressions régulières pour les noms de domaine valides?

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

Quel est votre cas d'utilisation pour une telle regex qui doit être maintenue lors de la création de nouveaux domaines? – mark

+0

Puisque toutes les réponses semblent donner d'autres façons de rechercher des TLD, je propose de renommer cette question pour éviter la duplication dans le futur (à moins que les gens commencent à répondre à la question de refactoring) – TheSoftwareJedi

+0

bonne idée - ce n'est vraiment pas un problème d'expression rationnelle. – Alnitak

Répondre

28

S'il vous plaît, s'il vous plaît, s'il vous plaît ne pas utiliser une regex fixe et horriblement compliqué comme celui-ci pour faire correspondre les noms de domaine connus. La liste des TLD est et non statique, en particulier avec l'ICANN qui examine un processus rationalisé pour les nouveaux gTLD. Même la liste des ccTLD change parfois!

Jetez un oeil à la liste disponible à partir de http://publicsuffix.org/ et écrivez du code qui est capable de télécharger et d'analyser cette liste à la place.

+0

Concernant les expressions régulières et les saignements oculaires: http://www.codinghorror.com/blog/archives/001016.html –

+0

supprimé le code à nouveau - tout noob peut lire un fichier sur le net, et sans le! etc la manipulation n'est pas utile. – Alnitak

+0

Je suppose que je suis d'accord. Il existe de meilleures façons de le faire, mais j'ai besoin de quelque chose qui est incroyablement faire des inscriptions/transferts. D'autres recommandations? –

0

Je n'en sais pas assez sur les noms de domaine. Mais pourquoi des domaines comme "foo.info.com" sont-ils assortis? Il semble que le nom de domaine est "info.com" dans ce cas particulier.

Et vous voudrez peut-être vous assurer que le nom commence par [a-z \ d]. Je ne pense pas que vous pouvez enregistrer un domaine qui commence par un tiret?

+0

Tous les noms de domaine ne sont pas en deux parties. Un exemple unique: "ck" est le domaine des îles Cook (essayez http: // ck ou http://www.ck); mon propre domaine est en trois parties (nichesoftware.co.nz) en raison d'une structure dans le .nz TLD. – Bevan

-1

Eh bien comme vous l'avez écrit il, la partie de TLD est équivalent mais plus long que (\.<tldpart>){1,2} mais je suis sûr qu'il pourrait être fixé pour la duplication ...

modifier: yech, non, il serait possible, mais essentiellement une liste de force brute très lente pour gérer les duplications je pense. Plus simple et plus rapide de mettre les paires de pays possibles TLD et SLD + dans une grande hashmap et vérifier la sous-chaîne par rapport à cela.

-1

Vous pouvez créer l'expression régulière sous forme de chaîne, puis faire Regexp.new (chaîne).

-1

Je recommande de commencer par les règles énoncées dans RFC 1035, puis de travailler en arrière - mais seulement si vous avez vraiment vraiment besoin de le faire à partir de zéro. Un modèle de regex de domaine doit être (la seconde derrière les modèles de regex d'adresse e-mail) la chose la plus courante. Je voudrais vérifier le site regexlib.com et parcourir ce que les autres ont fait.

+0

La RFC ne permet pas techniquement les parties de domaine entièrement numériques, mais en pratique les registrars et les serveurs de noms les autorisent depuis des années maintenant. –

4

Télécharger ceci: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

Exemple d'utilisation (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') 

Vous pouvez facteur le domaine liste-bâtiment de la fonction de validation pour améliorer les performances.

+2

Les résultats ne sont pas comme prévu pour des domaines comme awesomedomain.co.uk - le TLD n'est pas considéré .uk c'est .co.uk Il est préférable d'utiliser quelque chose comme http://publicsuffix.org/ –

+0

@DanEsparza: Et pourtant, [publicsuffix.org] (http://publicsuffix.org/) l'enregistre comme "* .uk" et _not_ comme "co.uk". –

+0

@DennisWilliamson le '*' dans l'entrée pour '* .uk' signifie que chaque _sub-domain_ de' .uk' est public - sauf pour ceux explicitement listés. – Alnitak