2010-08-06 32 views
0

L'extraction d'une représentation précise du domaine de premier niveau d'un nom d'hôte est compliquée par le fait que chaque registre de domaine de niveau supérieur est libre de créer ses propres politiques concernant quels sous-domaines sont définis. Comme il ne semble pas y avoir d'organisme de normalisation coordonnant ces normes ou établissant des normes, cela a fait de la détermination du TLD actuel une affaire quelque peu compliquée. Étant donné que les navigateurs Web n'attribuent des cookies qu'aux domaines enregistrés et que, pour des raisons de sécurité, les cookies ne peuvent être attribués à un niveau plus large, ces navigateurs contiennent généralement une base de données de tous les TLD connus sous une forme ou une autre. J'ai trouvé que Firefox a une base de données assez complète:Extraction d'un TLD de nom d'hôte avec une expression régulière

http://hg.mozilla.org/mozilla-central/raw-file/3f91606bd115/netwerk/dns/effective_tld_names.dat

J'ai deux questions spécifiques:

  • Bien qu'il soit assez trivial de convertir cette annonce en une expression régulière, est-il une gemme ou une regexp de référence qui est une meilleure solution que de rouler la vôtre? La gemme tld fournit uniquement des informations au niveau du pays pour le domaine de niveau racine.

  • Y a-t-il une meilleure référence que la liste de Firefox TLD? Tous les local Google sites sont correctement analysés par cette spécification, mais ce n'est pas un test exhaustif.

S'il n'y a rien là-bas, quelqu'un est-il intéressé par une gemme qui effectue ce genre d'opération? Ce genre de chose devrait être présent dans le module URI mais est apparemment manquant.

Voici mon point de vue sur la conversion de ce fichier dans un Regexp utilisable dans Ruby:

TLD_SPEC = Regexp.new(
    '[^\.]+\.(' + %q[ 
// ***** BEGIN LICENSE BLOCK ***** 
// ... (Rest of file) 
    ].split(/\n/).collect do |line| 
    line.sub(%r[//.*], '').sub(/\s+$/, '') 
    end.reject(&:blank?).collect do |s| 
    Regexp.escape(s).sub(/^\\\*\\\./, '[^\.]+\.') 
    end.join('|') + ')$' 
) 

Répondre

3

Vous pourriez vouloir regarder en utilisant Addressable pour voir si cela a ce dont vous avez besoin. Il a beaucoup plus de fonctionnalités que la bibliothèque URI par défaut de Ruby. En particulier, sa capacité de modèle pourrait vous aider.

De la documentation:

adressable est un remplacement pour la mise en œuvre URI qui fait partie de la bibliothèque standard de Ruby. Il se conforme plus étroitement aux RFC pertinents et ajoute le support pour les IRI et les modèles d'URI. En outre, il fournit un support étendu pour les modèles d'URI.

Avec l'ouverture récente des nouveaux TLD, ça va être un cauchemar pendant un moment. Consultez la liste associée à droite pour voir combien de personnes tentent de trouver une solution. Regex to match Domain.CCTLD recommande d'utiliser une fonction pour la décomposer en étapes plus petites et c'est ce que je ferais. Essayer de le faire avec une regex suppose que vous pouvez tout faire en une seule expression, qui commence à sentir comme utiliser regex pour analyser XML ou HTML.La cible est trop ondulée pour un seul motif, ou au moins pour un seul motif maintenable.

Cette réponse mentionne la liste des TLD publics. En utilisant les informations, vous pouvez rapidement utiliser les méthodes Regexp.escape et Regexp.union de Ruby pour construire une regex raisonnablement bonne à la volée. Ce serait bien si nous avions le module Regexp :: Assemble de Perl à notre disposition, mais nous ne l'aurions pas fait aussi union. (Voir "Is there an efficient way to perform hundreds of text substitutions in Ruby?" pour un moyen de contourner ce problème.)

1

Il y a un autre db-fichier plat ici à http://guava-libraries.googlecode.com/svn-history/r42/trunk/src/com/google/common/net/TldPatterns.java

Peut-être que vous pouvez combiner les deux, et le télécharger quelque part comme OData.org, github, sourceforge, etc.

+0

Il s'agit en partie d'un projet visant à déterminer si une adresse électronique est valide au-delà du test RFC822 habituel où 'x @ yz' serait considéré comme techniquement valide, mais évidemment pas une adresse e-mail réelle. Ce serait bien que l'ICANN publie une liste des TLD assignés mais apparemment ce n'est pas le cas. La page de liste [gTLD] (http://www.icann.org/en/tlds/) a même plusieurs liens brisés. – tadman

0

Il y a une gemme appelée public-suffix-list qui donne accès à une version plus formalisée de la liste de Mozilla.