69 votes

comment obtenir le nom de domaine depuis l'URL

Comment puis-je récupérer un nom de domaine à partir d'une chaîne d'URL?

Exemples:

 +----------------------+------------+
| input                | output     |
+----------------------+------------+
| www.google.com       | google     |
| www.mail.yahoo.com   | mail.yahoo |
| www.mail.yahoo.co.in | mail.yahoo |
| www.abc.au.uk        | abc        |
+----------------------+------------+
 

Apparenté, relié, connexe:

47voto

pi. Points 6026

Une fois, j'ai dû écrire un tel regex pour une entreprise, j'ai travaillé pour. La solution était:

  • Obtenir une liste de tous les ccTLD et gTLD disponibles. Votre première étape devrait être de l'IANA. La liste de Mozilla ressemble beaucoup à première vue, mais manque de ac.royaume-uni, par exemple, pour cela, il n'est pas vraiment utilisable.
  • S'inscrire sur la liste comme dans l'exemple ci-dessous. Un avertissement: l'ordre est important! Si org.royaume-uni semblerait, d'après le royaume-uni puis exemple.org.royaume-uni correspondent org au lieu de exemple.

Exemple regex:

.*([^\.]+)(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$

Cela a fonctionné très bien et correspond aussi bizarre, non officiels de haut niveaux comme de.com et des amis.

L'envers:

  • Très vite si la regex est parfaitement ordonné

L'inconvénient de cette solution est bien sûr:

  • Manuscrite regex qui doit être mis à jour manuellement si cctld modifier ou ajouté. Travail fastidieux!
  • Très grand regex donc pas très lisible.

15voto

chburd Points 2902

Le site web list @ Mozilla peut vous donner la liste effective des principaux niveaux de domaine.

10voto

J.F. Sebastian Points 102961
/^(?:www\.)?(.*?)\.(?:com|au\.uk|co\.in)$/

5voto

Richard Points 54016

Je ne sais pas du tout bibliothèques, mais la manipulation de la chaîne de noms de domaine est assez facile.

La partie difficile est de savoir si le nom est au deuxième ou de troisième niveau. Pour cela, vous aurez besoin d'un fichier de données vous maintenir (par exemple pour .royaume-uni est n'est pas toujours le troisième niveau, certaines organisations (par exemple, bl.royaume-uni, jet.royaume-uni) existent au deuxième niveau).

La source de Firefox de Mozilla a un fichier de données, cochez la Mozilla licence pour voir si vous pouvez les réutiliser.

4voto

user1195317 Points 31
 /* These are TLDs that have an SLD */
var tlds = {
    "cy":true,
    "ro":true,
    "ke":true,
    "kh":true,
    "ki":true,
    "cr":true,
    "km":true,
    "kn":true,
    "kr":true,
    "ck":true,
    "cn":true,
    "kw":true,
    "rs":true,
    "ca":true,
    "kz":true,
    "rw":true,
    "ru":true,
    "za":true,
    "zm":true,
    "bz":true,
    "je":true,
    "uy":true,
    "bs":true,
    "br":true,
    "jo":true,
    "us":true,
    "bh":true,
    "bo":true,
    "bn":true,
    "bb":true,
    "ba":true,
    "ua":true,
    "eg":true,
    "ec":true,
    "et":true,
    "er":true,
    "es":true,
    "pl":true,
    "in":true,
    "ph":true,
    "il":true,
    "pe":true,
    "co":true,
    "pa":true,
    "id":true,
    "py":true,
    "ug":true,
    "ky":true,
    "ir":true,
    "pt":true,
    "pw":true,
    "iq":true,
    "it":true,
    "pr":true,
    "sh":true,
    "sl":true,
    "sn":true,
    "sa":true,
    "sb":true,
    "sc":true,
    "sd":true,
    "se":true,
    "hk":true,
    "sg":true,
    "sy":true,
    "sz":true,
    "st":true,
    "sv":true,
    "om":true,
    "th":true,
    "ve":true,
    "tz":true,
    "vn":true,
    "vi":true,
    "pk":true,
    "fk":true,
    "fj":true,
    "fr":true,
    "ni":true,
    "ng":true,
    "nf":true,
    "re":true,
    "na":true,
    "qa":true,
    "tw":true,
    "nr":true,
    "np":true,
    "ac":true,
    "af":true,
    "ae":true,
    "ao":true,
    "al":true,
    "yu":true,
    "ar":true,
    "tj":true,
    "at":true,
    "au":true,
    "ye":true,
    "mv":true,
    "mw":true,
    "mt":true,
    "mu":true,
    "tr":true,
    "mz":true,
    "tt":true,
    "mx":true,
    "my":true,
    "mg":true,
    "me":true,
    "mc":true,
    "ma":true,
    "mn":true,
    "mo":true,
    "ml":true,
    "mk":true,
    "do":true,
    "dz":true,
    "ps":true,
    "lr":true,
    "tn":true,
    "lv":true,
    "ly":true,
    "lb":true,
    "lk":true,
    "gg":true,
    "uk":true,
    "gn":true,
    "gh":true,
    "gt":true,
    "gu":true,
    "jp":true,
    "gr":true,
    "nz":true
}

function isSecondLevelDomainPresent(domainParts) {
    return typeof tlds[domainParts[domainParts.length-1]] != "undefined";
}
function getDomainFromHostname(url) {
  domainParts = url.split(".");
  var cutOff =2;
  if (isSecondLevelDomainPresent(domainParts)) {
    cutOff=3;
  }
  return domainParts.slice(domainParts.length-cutOff, domainParts.length).join(".");
}
 

Au lieu d'écrire un regex volumineux, pourquoi ne pas utiliser la liste des TLD connus nécessitant un SLD et créer une table de hachage. Ensuite, lorsque vous divisez l’URL, vous pouvez savoir s’il faut prendre les 2 dernières pièces ou les 3 dernières.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X