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('|') + ')$'
)
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