Je recommande d'utiliser le package npm psl (Public Suffix List) . La "Liste des suffixes publics" est une liste de tous les suffixes et règles de domaine valides, pas seulement les domaines de premier niveau de code de pays, mais aussi les caractères unicode qui seraient considérés comme le domaine racine (par exemple www. 食 狮. 公司 .cn, bckobe .jp, etc.). En savoir plus ici .
Essayer:
npm install --save psl
Puis avec mon exécution "extractHostname":
let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com
Je ne peux pas utiliser un package npm, donc ci-dessous ne teste que extractHostname.
function extractHostname(url) {
var hostname;
//find & remove protocol (http, ftp, etc.) and get hostname
if (url.indexOf("//") > -1) {
hostname = url.split('/')[2];
}
else {
hostname = url.split('/')[0];
}
//find & remove port number
hostname = hostname.split(':')[0];
//find & remove "?"
hostname = hostname.split('?')[0];
return hostname;
}
//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));
Peu importe le protocole ou même le numéro de port, vous pouvez extraire le domaine. Il s'agit d'une solution non regex très simplifiée, donc je pense que cela suffira.
* Merci @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson pour vos suggestions! @ ross-allen, merci d'avoir signalé le bogue!
url.split('/')[2]
Depuis quel que nous écrivonsftp
,ftps
,https
, le nom de domaine sera toujours à l' index 2.return url.split('/')[2] || url.split('/')[0];
correspondances s'il n'y a pas de protocole.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Une astuce intéressante sans utiliser d'expressions régulières:
Enveloppez ce qui précède dans une fonction comme celle ci-dessous et vous avez vous-même un excellent moyen d'extraire la partie de domaine d'un URI.
la source
hostname
, il ne devrait pas, si vous voulez accéder à la fois auhostname
et auport
(et l'obtenir commedomain.sample:1234
simple accèsa.host
)Il n'est pas nécessaire d'analyser la chaîne, passez simplement votre URL comme argument au
URL
constructeur :la source
Essaye ça:
Si vous souhaitez exclure le port de votre résultat, utilisez plutôt cette expression:
Modifier: pour empêcher la correspondance de domaines spécifiques, utilisez une anticipation négative.
(?!youtube.com)
la source
?' (query) or
# `(fragment). par exemplehttp://example.com?var=val
ouhttp://example.com#fragment
. Ainsi, devrait être quelque chose comme la regex correcte:/^https?\:\/\/([^\/?#]+)/
. En dehors de cela, vous obtiendriez mon +1 (c'est la solution la plus rapide)(?:www\.)?
dans l'anticipation négative.(?:www\.)?
à l'expression régulière comme ceci:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
L'analyse d'une URL peut être délicate car vous pouvez avoir des numéros de port et des caractères spéciaux. En tant que tel, je recommande d'utiliser quelque chose comme parseUri pour le faire pour vous. Je doute que les performances soient un problème sauf si vous analysez des centaines d'URL.
la source
URL()
n'est pas encore entièrement pris en charge. Vérifier: caniuse.com/#feat=urlRéponse 2020
Vous n'avez pas besoin de dépendances supplémentaires pour cela! Selon que vous devez optimiser les performances ou non, il existe deux bonnes solutions:
Utilisation
URL.hostname
pour la lisibilitéÀ l'ère Babel, la solution la plus propre et la plus simple est d'utiliser
URL.hostname
.URL.hostname
fait partie de l' API URL , prise en charge par tous les principaux navigateurs sauf IE ( caniuse ). Utiliser un polyfill URL si vous devez prendre en charge les navigateurs hérités.L'utilisation de cette solution vous donnera également accès à d'autres propriétés et méthodes d'URL . Cela sera utile si vous souhaitez également extraire les URL chemin accès de ou les paramètres de chaîne de requête , par exemple.
Utilisez RegEx pour les performances
URL.hostname
est plus rapide que d'utiliser la solution d'ancrage ou parseUri . Cependant, il est encore beaucoup plus lent que l' expression régulière de gilly3 :Testez-le vous-même sur ce jsPerf
Si vous devez traiter un très grand nombre d'URL (où les performances seraient un facteur), je recommande plutôt d'utiliser cette solution. Sinon, choisissez la
URL.hostname
lisibilité.la source
J'ai essayé d'utiliser les solutions données, celle choisie était une surpuissance pour mon but et "Créer un élément" me dérange.
Il n'est pas encore prêt pour le port dans l'URL. J'espère que quelqu'un le trouve utile
Exécuter ceci:
Résultat:
la source
Si vous vous retrouvez sur cette page et que vous recherchez le meilleur REGEX d'URL, essayez celui-ci:
https://regex101.com/r/pX5dL9/1
Il fonctionne pour les URL sans http: //, avec http, avec https, avec juste // et ne récupère pas le chemin et le chemin de requête également.
Bonne chance
la source
Toutes les propriétés d'url, pas de dépendances, pas de JQuery, facile à comprendre
Cette solution donne votre réponse ainsi que des propriétés supplémentaires. Aucune JQuery ou autres dépendances requises, collez et c'est parti.
Usage
Production
Code
Le code est conçu pour être facile à comprendre plutôt que super rapide. Il peut être appelé facilement 100 fois par seconde, il est donc idéal pour le front-end ou pour quelques utilisations de serveur, mais pas pour un débit élevé.
la source
getUrlParts('www.google.com')
dans une console sur cette page.var url="https://mail.gggg.google.cn/link/link/link";
ledomainroot
devrait l'êtregoogle.com
mais il sort:gggg.google.cn
tandis que legggg
est un sous-domaine (les domaines peuvent avoir plusieurs sous-domaines).Utilisez simplement le constructeur URL () :
la source
Je cherchais une solution à ce problème aujourd'hui. Aucune des réponses ci-dessus ne semble satisfaisante. Je voulais une solution qui pourrait être une ligne unique, pas de logique conditionnelle et rien qui devait être enveloppé dans une fonction.
Voici ce que j'ai trouvé, qui semble très bien fonctionner:
Peut sembler compliqué à première vue, mais cela fonctionne assez simplement; la clé utilise 'slice (-n)' à quelques endroits où la bonne partie doit être tirée de la fin du tableau divisé (et [0] pour obtenir de l'avant du tableau divisé).
Chacun de ces tests renvoie "example.com":
la source
Voici le one-liner jQuery:
la source
la source
Le crédit d'origine va à: http://www.primaryobjects.com/CMS/Article145
la source
D'accord, je sais que c'est une vieille question, mais j'ai fait un analyseur d'URL super efficace, donc j'ai pensé que je le partagerais.
Comme vous pouvez le voir, la structure de la fonction est très étrange, mais c'est pour l'efficacité. Aucune fonction prototype n'est utilisée, la chaîne n'est pas répétée plus d'une fois et aucun caractère n'est traité plus que nécessaire.
la source
Ce n'est pas une réponse complète, mais le code ci-dessous devrait vous aider:
J'aimerais que quelqu'un crée du code plus rapidement que le mien. Cela aide aussi à m'améliorer.
la source
en ligne avec jquery
la source
la source
J'ai personnellement beaucoup recherché cette solution, et la meilleure que j'ai pu trouver est en fait la «vérification du navigateur» de CloudFlare:
J'ai réécrit des variables pour qu'elles soient plus lisibles "par l'homme", mais cela fait mieux que prévu.
la source
Eh bien, utiliser une expression régulière sera beaucoup plus facile:
la source
cela prend en charge à la fois le protocole.
la source
en bref, vous pouvez faire comme ça
Utilisez la fonction ci-dessus pour obtenir le nom de domaine
la source
?
dans votre chaîne de nom de domaine et au lieu dereturn domain.split("/")[0];
mettre cetreturn domain.split("?")[0];
espoir, cela fonctionneParse-Urls semble être la bibliothèque JavaScript avec les modèles les plus robustes
Voici un aperçu des fonctionnalités:
Chapitre 1. Normaliser ou analyser une URL
Chapitre 2. Extraire toutes les URL
Chapitre 3. Extraire des URI avec certains noms
Chapitre 4. Extraire toutes les URL floues
Chapitre 5. Mettez en surbrillance toutes les URL dans les textes
Chapitre 6. Extraire toutes les URL en HTML brut ou XML
la source
Code:
Résultat:
la source
www.
même si toutes les URL n'ont pas ce composant), mais c'est certainement une réponse .parse-domain - une bibliothèque légère très solide
npm install parse-domain
Exemple 1
Exemple 2
Pourquoi?
Selon le cas d'utilisation et le volume, je déconseille fortement de résoudre ce problème vous-même en utilisant l'expression régulière ou d'autres moyens de manipulation de chaînes. Le cœur de ce problème est que vous devez connaître tous les suffixes gtld et cctld pour analyser correctement les chaînes d'URL dans le domaine et les sous-domaines, ces suffixes sont régulièrement mis à jour. C'est un problème résolu et pas un que vous voulez résoudre vous-même (sauf si vous êtes google ou quelque chose). À moins que vous n'ayez besoin du nom d'hôte ou du nom de domaine à la rigueur, n'essayez pas d'analyser votre chemin hors de celui-ci.
la source
Mon code ressemble à ceci. Les expressions régulières peuvent prendre de nombreuses formes, et voici mes cas de test, je pense que c'est plus évolutif.
la source
Essayez ci-dessous le code pour le nom de domaine exact en utilisant l'expression régulière,
Ligne de chaîne = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";
la source