comment obtenir le nom de domaine à partir de 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 |
+----------------------+------------+
Connexes:
- ce sujet www.abc.def.ghi.au.uk?
- Quid de l'foo.bar.com”? Et “foo.com”?
- Eh bien, le deuxième poste en quelques minutes un sujet similaire -- devoirs? (stackoverflow.com/questions/568864/...)
- À quoi puis-je vous demander? Il est difficile d'inventer pour quoi avez-vous besoin des noms de domaine sans 2ème niveau de suffixe de domaine (comme .co.royaume-uni)
- Hemal: dans ce cas, la production prévue est abc.def.ghi @ Bombe: je dois enlever le préfixe www, de toute façon
- Le problème n'est pas résoluble. Vous ne pouvez pas dire si xx foo.xx.yy doit être retiré trop (Pourquoi avez-vous retiré de l'ua.royaume-uni et non pas seulement royaume-uni?)
- D'accord avec 'n'est pas soluble'. De trop nombreux états qui s'excluent mutuellement.
- Votre terminologie est toutes sortes de mal ici. Toutes les entrées de la liste sont des noms de domaine, pas les Url. C'est une URL:
http://en.wikipedia.org/wiki/URL
, le nom de domaine dans l'URL esten.wikipedia.org
- J'ai trouvé cette réponse très utile: stackoverflow.com/a/4820675/1740705.
Vous devez vous connecter pour publier un commentaire.
Une fois, j'ai dû écrire un tel regex pour une entreprise, j'ai travaillé pour. La solution était:
Exemple regex:
Cela a fonctionné très bien et correspond aussi bizarre, non officiels de haut niveaux comme de.com et amis.
L'envers:
L'inconvénient de cette solution est bien sûr:
*.uk
, donc @pi.'s inquiet à ce sujet, étant incapable de correspondanceac.uk
ne s'applique plus.Extraire le nom de Domaine avec précision peut être très difficile, principalement parce que l'extension de domaine peut contenir 2 pièces (comme des .com.au ou .co.royaume-uni) et le sous-domaine (le préfixe) peut ou peut ne pas être là. Liste de toutes les extensions de nom de domaine n'est pas une option, car il y a des centaines de ces. EuroDNS.com par exemple des listes de plus de 800 extensions de nom de domaine.
J'ai donc écrit une fonction php qui utilise 'parse_url()' et quelques observations à propos des extensions de domaine à extraire avec précision l'url des composants ET le nom de domaine. La fonction est la suivante:
Cette simple fonction fonctionne dans presque tous les cas. Il y a quelques exceptions, mais elles sont très rares.
Pour démontrer /tester cette fonction, vous pouvez utiliser les éléments suivants:
La sortie sera comme suit pour l'adresse URL de la liste:
Comme vous pouvez le voir, le nom de domaine et le nom de domaine sans extension sont toujours extraites quelle que soit l'URL qui est présenté à la fonction.
J'espère que cela aide.
Je ne sais pas du tout bibliothèques, mais la manipulation de la chaîne de noms de domaine est assez facile.
La partie la plus 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.
Il y a deux façons
À l'aide de split
Puis juste analyser cette chaîne
En Utilisant Les Regex
Espère que cette aide
Ce code n'est pas garanti pour fonctionner avec toutes les Url et ne filtre pas ceux qui sont grammaticalement correctes mais pas comme l'exemple."au royaume-uni.
Cependant, il va faire le travail dans la plupart des cas.
Fondamentalement, ce que vous voulez, c'est:
Facultatif:
Vous n'avez pas besoin de construire un monde changeant regex comme 99% des domaines seront appariés correctement si vous regardez simplement la 2e de la dernière partie du nom:
Si c'en est un, alors vous avez besoin pour correspondre à 3 points, d'autre 2. Simple. Maintenant, ma regex wizardry est pas de match pour que de la, des livres, de sorte que le meilleur moyen que j'ai trouvé pour y parvenir est avec un peu de code, en supposant que vous avez déjà dépouillé de l'path:
Pour obtenir juste le nom, comme par votre question:
J'aime cette approche, car il est exempt d'entretien. Sauf si vous voulez valider le fait que c'est en fait un domaine légitime, mais c'est un peu inutile, parce que vous avez le plus de chances que l'utilisation de ce traiter les fichiers journaux et un domaine non valide de ne pas trouver son chemin dans la là en premier lieu.
Si vous souhaitez correspondre à "officieux" des sous-domaines tels que bozo.za.net ou bozo.de l'ua.royaume-uni, bozo.msf.ru juste ajouter (za|au|msf) pour l'expression rationnelle.
Je serais ravi de voir quelqu'un faire tout cela en utilisant simplement une regex, je suis sûr que c'est possible.
Il n'est pas possible sans l'aide d'un TLD liste à comparer avec leur existe de nombreux cas comme http://www.db.de/ ou http://bbc.co.uk/ qui sera interprétée par une expression régulière comme les domaines
db.de
(correct) etco.uk
(faux).Mais même avec cela, vous n'aurez pas de succès si votre liste ne contient pas les Sld, trop. Les url comme http://big.uk.com/ et http://www.uk.com/ serait à la fois interprété comme
uk.com
(le premier domaine est big.uk.com).Parce que tous les navigateurs d'utiliser Mozilla Public de la Liste de suffixes:
https://en.wikipedia.org/wiki/Public_Suffix_List
Vous pouvez l'utiliser dans votre code par important à travers cette URL:
http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
Hésitez pas à prolonger ma fonction pour extraire le nom de domaine uniquement. Ne pas utiliser les regex et il est rapide:
http://www.programmierer-forum.de/domainnamen-ermitteln-t244185.htm#3471878
/[^w{3}\.]([a-zA-Z0-9]([a-zA-Z0-9\-]{0,65}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}/gim
l'utilisation de ce javascript regex ignore www et à la suite de dot, tout en conservant le domaine intact. aussi bien ne correspond à aucun " www et de cc tld
Vous avez besoin d'une liste de ce domaine, des préfixes et des suffixes peuvent être supprimés. Par exemple:
Préfixes:
www.
Suffixes:
.com
.co.in
.au.uk
Donc si vous avez une chaîne et non une fenêtre.l'emplacement vous pouvez utiliser...
Comment l'utiliser.
Pour un certain but, j'ai fait ce rapide fonction Python hier. Il renvoie le domaine à partir de l'URL. Il est rapide et ne necessite pas de fichier d'entrée d'inscription des trucs. Cependant, je ne prétends pas que cela fonctionne dans tous les cas, mais il a vraiment fait le travail, j'avais besoin d'un simple texte d'exploration de script.
De sortie ressemble à ceci :
http://www.google.co.uk => google.co.royaume-uni
http://24.media.tumblr.com/tumblr_m04s34rqh567ij78k_250.gif => tumblr.com
Semble fonctionner assez bien.
Cependant, il doit être modifié pour supprimer les extensions de domaine sur la production comme vous le souhaitiez.
Utiliser cette
(.)(.*?)(.)
ensuite, il suffit d'extraire le leader et les points de fin.
Facile, droit?
comment est-ce
=((?:(?:(?:http)s?:)?\/\/)?(?:(?:[a-zA-Z0-9]+)\.?)*(?:(?:[a-zA-Z0-9]+))\.[a-zA-Z0-9]{2,3})
(vous voudrez peut-être ajouter "\/" à la fin de motif
si votre objectif est de débarrasser l'url est transmis en tant que paramètre, vous pouvez, ajouter le signe égal que le premier char, comme:
=((?:(?:(?:http)s?:)?//)?(?:(?:[a-zA-Z0-9]+).?)*(?:(?:[a-zA-Z0-9]+)).[a-zA-Z0-9]{2,3}/)
et les remplacer par des "/"
L'objectif de cet exemple pour se débarrasser de tout nom de domaine, quelle que soit la forme qu'il apparaît dans.
(c'est à dire à s'assurer de paramètres d'url n'est pas incldue noms de domaine pour éviter les attaques xss)
Je sais que la question est à la recherche d'une expression régulière de la solution, mais à chaque tentative, il ne fonctionnera pas pour couvrir tout
J'ai décidé d'écrire cette méthode en Python qui fonctionne uniquement avec des url qui ont un sous-domaine (c'est à dire http://www.mydomain.co.uk) et ne multiples au niveau des sous-domaines comme
www.mail.yahoo.com
$url =~ m{([^:]*://)?([^/]*\.)*([^/\.]+)\.[^/]+}
pas sûr que vous voulez la boucle de l'opérateur (/g) soit?Juste pour savoir: