Ich empfehle die Verwendung des npm-Pakets psl (Public Suffix List) . Die "Öffentliche Suffixliste" ist eine Liste aller gültigen Domain-Suffixe und -Regeln, nicht nur Ländercode-Top-Level-Domains, sondern auch Unicode-Zeichen, die als Root-Domain gelten würden (z. B. www. 食 狮. 公司 .cn, bckobe .jp usw.). Lesen Sie hier mehr darüber .
Versuchen:
npm install --save psl
Dann mit meiner Implementierung "extractHostname" ausführen:
let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com
Ich kann kein npm-Paket verwenden, daher wird im Folgenden nur extractHostname getestet.
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"));
Unabhängig vom Protokoll oder der Portnummer können Sie die Domäne extrahieren. Dies ist eine sehr vereinfachte Lösung ohne Regex, daher denke ich, dass dies ausreichen wird.
* Vielen Dank an @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson für Ihre Vorschläge! @ Ross-Allen, danke, dass du den Fehler gemeldet hast!
url.split('/')[2]
unabhängig Da der wir schreibenftp
,ftps
,https
, wird der Domainname im Index immer 2.return url.split('/')[2] || url.split('/')[0];
die Übereinstimmungen verwenden, wenn kein Protokoll vorhanden ist.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Ein ordentlicher Trick ohne reguläre Ausdrücke:
Wenn Sie das Obige in eine Funktion wie die folgende einschließen, haben Sie selbst eine hervorragende Möglichkeit, den Domain-Teil aus einer URI zu entreißen.
quelle
hostname
, sollte es nicht, wenn Sie sowohl auf diehostname
als auch auf die zugreifen möchtenport
(und sie alsdomain.sample:1234
a.host
Die Zeichenfolge muss nicht analysiert werden. Übergeben Sie einfach Ihre URL als Argument an den
URL
Konstruktor :quelle
Versuche dies:
Wenn Sie den Port von Ihrem Ergebnis ausschließen möchten, verwenden Sie stattdessen diesen Ausdruck:
Bearbeiten: Um zu verhindern, dass bestimmte Domänen übereinstimmen, verwenden Sie einen negativen Lookahead.
(?!youtube.com)
quelle
?' (query) or
# `(Fragment) enden . zBhttp://example.com?var=val
oderhttp://example.com#fragment
. Der richtige Regex sollte also ungefähr so lauten :/^https?\:\/\/([^\/?#]+)/
.(?:www\.)?
dem negativen Lookahead ein optionales hinzufügen .(?:www\.)?
dem regulären Ausdruck wie/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
Das Parsen einer URL kann schwierig sein, da Sie Portnummern und Sonderzeichen haben können. Daher empfehle ich, etwas wie parseUri zu verwenden, um dies für Sie zu tun. Ich bezweifle, dass die Leistung ein Problem sein wird, wenn Sie nicht Hunderte von URLs analysieren.
quelle
URL()
wird noch nicht vollständig unterstützt. Überprüfen Sie: caniuse.com/#feat=urlZur
URL.hostname
besseren Lesbarkeit verwendenIn der Babel-Ära ist die Verwendung die sauberste und einfachste Lösung
URL.hostname
.URL.hostname
ist Teil der URL-API , die von allen gängigen Browsern außer IE ( caniuse ) unterstützt wird. Verwenden Sie eine URL-Polyfüllung, wenn Sie ältere Browser unterstützen müssen.Mit dieser Lösung erhalten Sie auch Zugriff auf andere URL-Eigenschaften und -Methoden . Dies ist nützlich, wenn Sie beispielsweise auch den Pfadnamen oder die Abfragezeichenfolgenparameter der URL extrahieren möchten .
Verwenden Sie RegEx für die Leistung
URL.hostname
ist schneller als die Verwendung von Ankerlösung oder parseUri . Es ist jedoch immer noch viel langsamer als der reguläre Ausdruck von gilly3 :Testen Sie es selbst auf diesem jsPerf
Wenn Sie eine sehr große Anzahl von URLs verarbeiten müssen (wobei die Leistung eine Rolle spielt), empfehle ich stattdessen die Verwendung dieser Lösung. Andernfalls wählen Sie die
URL.hostname
Lesbarkeit.quelle
Ich habe versucht, die gegebenen Lösungen zu verwenden, die gewählte war ein Overkill für meinen Zweck und "Erstellen eines Elements" bringt mich durcheinander.
Es ist noch nicht bereit für Port in URL. Ich hoffe, jemand findet es nützlich
Führen Sie dies aus:
Ergebnis:
quelle
Wenn Sie auf dieser Seite landen und nach dem besten REGEX von URLs suchen, versuchen Sie Folgendes:
https://regex101.com/r/pX5dL9/1
Es funktioniert für URLs ohne http: //, mit http, mit https, mit nur // und greift nicht auf den Pfad und den Abfragepfad zu.
Viel Glück
quelle
Alle URL-Eigenschaften, keine Abhängigkeiten, keine JQuery, leicht zu verstehen
Diese Lösung gibt Ihre Antwort sowie zusätzliche Eigenschaften. Keine JQuery oder andere Abhängigkeiten erforderlich, einfügen und loslegen.
Verwendung
Ausgabe
Code
Der Code ist so konzipiert, dass er leicht zu verstehen und nicht sehr schnell ist. Es kann problemlos 100 Mal pro Sekunde aufgerufen werden, eignet sich also hervorragend für das Front-End oder einige Server-Anwendungen, jedoch nicht für einen hohen Volumendurchsatz.
quelle
getUrlParts('www.google.com')
in einer Konsole auf dieser Seite.var url="https://mail.gggg.google.cn/link/link/link";
dasdomainroot
sollte sein,google.com
aber es gibt aus:gggg.google.cn
während dasgggg
eine Unterdomäne ist (Domänen können mehrere Unterdomänen haben).Benutz einfach den URL () -Konstruktor :
quelle
Ich habe heute nach einer Lösung für dieses Problem gesucht. Keine der obigen Antworten schien zu befriedigen. Ich wollte eine Lösung, die ein Einzeiler sein kann, keine bedingte Logik und nichts, was in eine Funktion eingeschlossen werden muss.
Folgendes habe ich mir ausgedacht, scheint wirklich gut zu funktionieren:
Mag auf den ersten Blick kompliziert aussehen, aber es funktioniert ziemlich einfach; Der Schlüssel verwendet 'Slice (-n)' an einigen Stellen, an denen der gute Teil vom Ende gezogen werden muss des geteilten Arrays gezogen werden muss (und [0], um von der Vorderseite des geteilten Arrays zu gelangen).
Jeder dieser Tests gibt "example.com" zurück:
quelle
Hier ist der jQuery-Einzeiler:
quelle
quelle
Das ursprüngliche Guthaben geht an: http://www.primaryobjects.com/CMS/Article145
quelle
Okay, ich weiß, dass dies eine alte Frage ist, aber ich habe einen supereffizienten URL-Parser erstellt, also dachte ich, ich würde ihn teilen.
Wie Sie sehen können, ist die Struktur der Funktion sehr seltsam, aber es dient der Effizienz. Es werden keine Prototypfunktionen verwendet, die Zeichenfolge wird nicht mehr als einmal iteriert und kein Zeichen wird mehr als erforderlich verarbeitet.
quelle
Dies ist keine vollständige Antwort, aber der folgende Code sollte Ihnen helfen:
Ich möchte, dass jemand Code schneller erstellt als ich. Es hilft auch, mich selbst zu verbessern.
quelle
online mit jquery
quelle
quelle
Ich persönlich habe viel nach dieser Lösung gesucht, und die beste, die ich finden konnte, stammt aus CloudFlares "Browser-Check":
Ich habe Variablen neu geschrieben, damit sie "menschlicher" lesbar sind, aber sie machen den Job besser als erwartet.
quelle
Die Verwendung eines regulären Ausdrucks ist viel einfacher:
quelle
Dies kümmert sich um beide Protokolle.
quelle
Kurz gesagt, Sie können dies tun
Verwenden Sie die obige Funktion, um den Domainnamen abzurufen
quelle
?
Ihrer Domain-Namen-Zeichenfolgereturn domain.split("/")[0];
return domain.split("?")[0];
Parse-Urls scheint die JavaScript-Bibliothek mit den robustesten Mustern zu sein
Hier ist ein Überblick über die Funktionen:
Kapitel 1. Normalisieren oder analysieren Sie eine URL
Kapitel 2. Extrahieren Sie alle URLs
Kapitel 3. URIs mit bestimmten Namen extrahieren
Kapitel 4. Extrahieren Sie alle Fuzzy-URLs
Kapitel 5. Markieren Sie alle URLs in Texten
Kapitel 6. Extrahieren Sie alle URLs in Roh-HTML oder XML
quelle
Code:
Ergebnis:
quelle
www.
, obwohl nicht alle URLs diese Komponente haben), aber es ist sicherlich eine Antwort .Parse-Domain - eine sehr solide, leichte Bibliothek
npm install parse-domain
Beispiel 1
Beispiel 2
Warum?
Je nach Anwendungsfall und Volumen empfehle ich dringend, dieses Problem nicht selbst mit Regex oder anderen Mitteln zur Manipulation von Zeichenfolgen zu lösen. Der Kern dieses Problems besteht darin, dass Sie alle Suffixe gtld und cctld kennen müssen, um URL-Zeichenfolgen ordnungsgemäß in Domänen und Subdomänen zu analysieren. Diese Suffixe werden regelmäßig aktualisiert. Dies ist ein gelöstes Problem und keines, das Sie selbst lösen möchten (es sei denn, Sie sind Google oder so). Versuchen Sie nicht, Ihren Weg aus diesem heraus zu analysieren, es sei denn, Sie benötigen zur Not den Host- oder Domainnamen.
quelle
Mein Code sieht so aus. Reguläre Ausdrücke können in vielen Formen vorliegen, und hier sind meine Testfälle, die meiner Meinung nach skalierbarer sind.
quelle
Versuchen Sie den folgenden Code für den genauen Domainnamen mit Regex.
String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";
quelle