Obtenir le sous-domaine à partir d'une URL
Obtenir le sous-domaine à partir d'une URL semble facile au premier abord.
http://www.domain.example
D'analyse pour la première période, puis de retourner tout ce qui vient après le "http://" ...
Alors, vous vous rappelez
http://super.duper.domain.example
Oh. Alors vous pensez, ok, trouver la dernière période, revenir un mot et obtenir le tout avant de!
Alors, vous vous rappelez
http://super.duper.domain.co.uk
Et vous êtes de retour à la case départ. N'importe qui ont des idées géniales, en plus de stocker une liste de tous les Tld?
- Cette question a déjà été posée ici: l'Obtention de Pièces d'une URL Edit: Une question similaire a été posée ici : )
- Cam-vous préciser ce que vous voulez? Il semble que vous êtes après la "officielle" de la partie de domaine de l'URL (c'est à dire de domaine.co.royaume-uni), indépendamment de la façon dont beaucoup de DNS étiquettes apparaissent devant elle?
- Je ne pense pas que c'est la même question - ce qui semble être plus sur l'administration des coupes dans le nom de domaine qui ne peut pas être réalisé simplement en regardant la chaîne
- Je suis d'accord. Étendre plus sur ce que votre objectif final est de.
- Voir cette réponse : stackoverflow.com/a/39307593/530553
- Vous pouvez utiliser cette api geekystats.com/api/v1/urlDetails?url=google.co.uk pour obtenir les détails
Vous devez vous connecter pour publier un commentaire.
Non, parce que chaque TLD diffère sur ce qui est considéré comme un sous-domaine, un domaine de deuxième niveau, etc.
Garder à l'esprit qu'il existe des domaines de premier niveau, deuxième niveau, des domaines et sous-domaines. Techniquement parlant, tout, sauf le TLD est un sous-domaine.
Dans le domaine.com.exemple au royaume-uni, "domaine" est un sous-domaine, "com" est un domaine de deuxième niveau, et "royaume-uni" est le TLD.
Donc, la question reste plus complexe qu'à première vue, et il dépend de la façon dont chaque TLD est géré. Vous aurez besoin d'une base de données de tous les Tld qui comprennent leur partitionnement, et ce qui est considéré comme un domaine de deuxième niveau et un sous-domaine. Il n'y a pas trop de Tld, donc la liste est raisonnablement gérable, mais la collecte de toutes ces informations n'est pas trivial. Il y a peut-être déjà une liste de ce type disponible.
Ressemble http://publicsuffix.org/ en est une liste de tous les suffixes courants (.com, le .co.royaume-uni, etc) dans une liste adapté à la recherche. Il ne veut toujours pas être facile à analyser, mais au moins vous n'avez pas à mettre à jour la liste.
À la recherche par le biais de la liste, vous pouvez voir, c'est pas un problème trivial. Je pense que la liste est la seule façon correcte pour ce faire...
Comme Adam dit, il n'est pas facile, et il est actuellement le seul moyen pratique est d'utiliser une liste.
Même alors, il y a des exceptions - par exemple dans
.uk
il y a une poignée de domaines qui sont valables immédiatement à ce niveau, qui ne sont pas dans.co.uk
, de sorte que celles-ci doivent être ajoutés comme des exceptions.C'est actuellement la façon dont les navigateurs grand public ce faire, il est nécessaire de s'assurer que
example.co.uk
ne pouvez pas définir un Cookie pour.co.uk
qui pourrait ensuite être envoyé à n'importe quel autre site web, sous l'.co.uk
.La bonne nouvelle, c'est qu'il y a déjà une liste disponible à http://publicsuffix.org/.
Il y a aussi certains travaux dans le L'IETF pour créer une sorte de standard pour permettre Tld à déclarer que leur structure de domaine ressemble. C'est un peu compliqué mais par les goûts de
.uk.com
, qui est exploité comme si c'était un public de suffixe, mais il n'est pas vendu par le.com
registre..uk
de registre de domaine, permet maintenant enregistrements directement au deuxième niveau. Ceci est reflété dans la LSIP.Publicsuffix.org semble la façon de faire. Il y a beaucoup de mises en œuvre pour analyser le contenu de la publicsuffix fichier de données fichier facilement:
Comme déjà dit par Adam et John publicsuffix.org est la bonne façon de procéder. Mais, si pour une raison quelconque vous ne pouvez pas utiliser cette approche, voici une heuristique basée sur une hypothèse qui fonctionne pour 99% de tous les domaines:
Il y a une propriété qui le distingue (pas tous, mais presque tous) les "vrais" noms de domaines à partir de sous-domaines et les Tld et c'est le DNS de l'enregistrement MX. Vous pouvez créer un algorithme qui recherche ce: Supprimer les composants du nom d'hôte, un par un, et d'interroger le DNS jusqu'à ce que vous trouver un enregistrement MX. Exemple:
Voici un exemple en php:
.ai
ou.ax
juste nommer quelques-uns).Comme déjà dit Public Liste De Suffixes est seulement un moyen d'analyser de domaine correctement. Pour PHP, vous pouvez essayer TLDExtract. Voici un exemple de code:
Viens d'écrire un programme pour ce en clojure basée sur les informations de publicsuffix.org:
https://github.com/isaksky/url_dom
Par exemple:
Pour une bibliothèque en C (avec les données de la table de génération en Python), j'ai écrit http://code.google.com/p/domain-registry-provider/ qui est à la fois rapide et efficace de l'espace.
La bibliothèque utilise ~30 ko pour les données des tables et des ~10k pour le code C. Il n'y a pas de démarrage généraux depuis les tables sont construites au moment de la compilation. Voir http://code.google.com/p/domain-registry-provider/wiki/DesignDoc pour plus de détails.
Pour mieux comprendre le tableau de la génération de code (Python), commencez ici: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/registry_tables_generator/registry_tables_generator.py
Afin de mieux comprendre l'API C, voir: http://code.google.com/p/domain-registry-provider/source/browse/trunk/src/domain_registry/domain_registry.h
Il ne fonctionne pas il exactement, mais vous pourriez peut-être obtenir une réponse utile en essayant de récupérer le domaine de pièce par pièce et de la vérification de la réponse, c'est à dire, chercherhttp://uk', puis 'http://co.uk', puis 'http://domain.co.uk'. Lorsque vous obtenez une non-réponse d'erreur que vous avez le domaine et le reste est sous-domaine.
Parfois vous avez juste obtenu de l'essayer 🙂
Edit:
Tom Leys points dans les commentaires, que certains domaines sont mis en place uniquement sur le sous-domaine www, ce qui nous donnerait une mauvaise réponse dans le test ci-dessus. Bon point! Peut-être que la meilleure approche serait de vérifier chaque partie avec " http://www ' ainsi que 'http://', et de compter les coups, soit comme un succès pour la section de la nom de domaine? Nous serions toujours pas certains de rechange, tels que des accords 'web.domain.com" mais je n'ai pas exécuté dans l'un de ceux-ci pour un certain temps 🙂
.DK
et quelques autres, commehttp://dk/
fonctionne comme est. Ce type d'heuristiques ne sont pas la voie à suivre...Utiliser le URIBuilder
puis obtenir le URIBUilder.l'hôte de l'attribut
de le diviser en un tableau sur "."
vous avez maintenant un tableau avec le domaine séparé.
Je viens d'écrire un objc bibliothèque : https://github.com/kejinlu/KKDomain
Vous pouvez utiliser cette lib tld.js: l'API JavaScript du travail contre des noms de domaine, sous-domaines et Uri.
Si vous avez trouvé à la racine de domaine dans le navigateur. Vous pouvez utiliser cette lib AngusFu/navigateur-root-domaine.
À l'aide de cookie est délicate.
Si vous êtes à la recherche d'extraire des sous-domaines et/ou de domaines à partir d'un arbitraire de la liste des Url, ce script python peut être utile. Attention tout de même, il n'est pas parfait. C'est un problème difficile à résoudre, en général, et c'est très utile si vous avez une liste blanche des domaines que vous attendez.
Liste de suffixes courants (.co.royaume-uni, .com, et cetera) à bande, le long de avec http://et alors vous aurez seulement "sous.domaine" de travail au lieu de "http://sub.domain.suffix", ou du moins c'est ce que je ferais probablement.
Le plus gros problème est la liste de suffixes. Il y en a beaucoup, après tout.
Avoir pris un coup d'oeil rapide à l'publicsuffix.org liste, il semble que vous pourriez faire une approximation raisonnable en retrait de la finale en trois segments ("segment" signifiant ici une section entre deux points) des domaines où le segment final est de deux caractères, sur l'hypothèse que c'est un code de pays et être subdivisés. Si le segment final est le "nous" et l'avant-dernier segment est également à deux personnages, retirez les quatre derniers segments. Dans tous les autres cas, supprimer les deux derniers segments. par exemple:
"exemple" n'est pas deux personnages, donc, supprimer "domaine.exemple", laissant "www"
"exemple" n'est pas deux personnages, donc, supprimer "domaine.exemple", laissant "super.duper"
"royaume-uni" est de deux caractères (mais pas "nous"), donc supprimer "domaine.co.royaume-uni", laissant "super.duper"
"nous" c'est les deux personnages et qui est le "nous", plus "wy" est également à deux personnages, donc supprimer "pvt.k12.wy.nous", laissant "foo".
Noter que, bien que cela fonctionne pour tous les exemples que j'ai vu dans les réponses jusqu'à présent, il ne reste qu'une approximation raisonnable. Il n'est pas tout à fait correct, bien que je soupçonne que c'est à peu près aussi proche que vous êtes susceptible d'obtenir, sans faire/obtenir une liste à utiliser pour référence.
http://www.bit.ly
àhttp://tla.com.au
.NAME
par exemple, quand vous pourriez acheter seulementfirstname.lastname.name
noms de domaine. Et dans le sens contraire, maintenant.US
est aussi plat, de sorte que vous pouvez avoirx.y.z.whatever.us
par juste acheter deswhatever.us
au registre et de votre algorithme échoue sur elle.