Bei gegebener URL möchte ich den Domainnamen extrahieren (er sollte keinen 'www'-Teil enthalten). URL kann http / https enthalten. Hier ist der Java-Code, den ich geschrieben habe. Obwohl es gut zu funktionieren scheint, gibt es einen besseren Ansatz oder gibt es einige Randfälle, die fehlschlagen könnten.
public static String getDomainName(String url) throws MalformedURLException{
if(!url.startsWith("http") && !url.startsWith("https")){
url = "http://" + url;
}
URL netUrl = new URL(url);
String host = netUrl.getHost();
if(host.startsWith("www")){
host = host.substring("www".length()+1);
}
return host;
}
Eingabe: http://google.com/blah
Ausgabe: google.com
http://74.125.226.70
und lassen Sie mich wissen, wie das funktioniert :)http://www.de/
oderhttp://www.com/
wird nicht die gewünschten Ergebnisse liefern.Antworten:
Wenn Sie eine URL analysieren möchten, verwenden Sie
java.net.URI
.java.net.URL
hat eine Reihe von Problemen - seineequals
Methode führt eine DNS-Suche durch, was bedeutet, dass der verwendete Code bei Verwendung mit nicht vertrauenswürdigen Eingaben anfällig für Denial-of-Service-Angriffe sein kann."Mr. Gosling - warum haben Sie dafür gesorgt, dass URL gleich saugt?" erklärt ein solches Problem. Gewöhnen Sie sich einfach an,
java.net.URI
stattdessen zu verwenden.sollte tun was du willst.
Ihr geschriebener Code schlägt für die gültigen URLs fehl:
httpfoo/bar
- relative URL mit einer Pfadkomponente, die mit beginnthttp
.HTTP://example.com/
- Das Protokoll unterscheidet nicht zwischen Groß- und Kleinschreibung.//example.com/
- Protokoll relative URL mit einem Hostwww/foo
- eine relative URL mit einer Pfadkomponente, die mit beginntwww
wwwexample.com
- Domainname, der nicht mit,www.
sondern mit beginntwww
.Hierarchische URLs haben eine komplexe Grammatik. Wenn Sie versuchen, Ihren eigenen Parser zu rollen, ohne RFC 3986 sorgfältig zu lesen, werden Sie wahrscheinlich etwas falsch machen. Verwenden Sie einfach die in die Kernbibliotheken integrierte.
Wenn Sie wirklich mit unordentlichen Eingaben umgehen müssen, die
java.net.URI
zurückweisen, lesen Sie RFC 3986 Anhang B:quelle
www.google.com
ist eine relative URL mit einer Pfadkomponentewww.google.com
. Zum Beispiel, wenn gegen gelösthttp://example.com/
, würden Sie bekommenhttp://example.com/www.google.com
.Weiterlesen
quelle
Hier ist eine kurze und einfache Zeile, die
InternetDomainName.topPrivateDomain()
in Guave verwendet wird:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Gegeben
http://www.google.com/blah
, das wird dir gebengoogle.com
. Oder gegebenhttp://www.google.co.mx
, es wird dir gebengoogle.co.mx
.Wie Sa Qada in einer anderen Antwort zu diesem Beitrag kommentierte , wurde diese Frage bereits früher gestellt: Extrahieren Sie den Hauptdomainnamen aus einer bestimmten URL . Die beste Antwort auf diese Frage kommt von Satya , die Guavas InternetDomainName.topPrivateDomain () vorschlägt.
Wenn Sie das zusammenstellen
URL.getHost()
, was der ursprüngliche Beitrag bereits enthält, erhalten Sie:quelle
Ich habe eine Methode geschrieben (siehe unten), die den Domainnamen einer URL extrahiert und einen einfachen String-Abgleich verwendet. Was es tatsächlich tut, ist das Bit zwischen dem ersten
"://"
(oder Index,0
wenn es nicht"://"
enthalten ist) und dem ersten nachfolgenden zu extrahieren"/"
(oder Index,String.length()
wenn es keinen nachfolgenden gibt"/"
) zu . Das verbleibende vorhergehende"www(_)*."
Bit wird abgeschnitten. Ich bin mir sicher, dass es Fälle geben wird, in denen dies nicht gut genug ist, aber in den meisten Fällen sollte es gut genug sein!Mike Samuels Beitrag oben besagt, dass die
java.net.URI
Klasse dies tun konnte (und derjava.net.URL
Klasse vorgezogen wurde ), aber ich hatte Probleme mit derURI
Klasse. Gibt insbesondereURI.getHost()
einen Nullwert an, wenn die URL das Schema, dh das"http(s)"
Bit, nicht enthält.quelle
http://bob.com:8080/service/read?name=robert
Ich habe nach der URI-Objekterstellung eine kleine Behandlung durchgeführt
quelle
In meinem Fall brauchte ich nur die Hauptdomain und nicht die Subdomain (kein "www" oder was auch immer die Subdomain ist):
Bei dieser Methode hat die URL " https://rest.webtoapp.io/llSlider?lg=de&t=8 " für die Domain "webtoapp.io".
quelle
Versuchen Sie dies: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (neue URL (" https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains "));
quelle
Es gibt eine ähnliche Frage: Extrahieren Sie den Hauptdomänennamen aus einer bestimmten URL . Wenn Sie sich diese Antwort ansehen , werden Sie feststellen, dass es sehr einfach ist. Sie müssen nur verwenden
java.net.URL
undString
Dienstprogramm -Split
quelle
Erläuterung: Der reguläre Ausdruck besteht aus 4 Gruppen. Die ersten beiden sind nicht übereinstimmende Gruppen und die nächsten beiden sind übereinstimmende Gruppen.
Die erste nicht übereinstimmende Gruppe ist "http" oder "https" oder ""
Die zweite nicht übereinstimmende Gruppe ist "www". oder ""
Die zweite übereinstimmende Gruppe ist die Domäne der obersten Ebene
Die erste übereinstimmende Gruppe ist alles nach den nicht übereinstimmenden Gruppen und alles vor der Domäne der obersten Ebene
Die Verkettung der beiden übereinstimmenden Gruppen gibt uns den Domain- / Hostnamen.
PS: Beachten Sie, dass Sie dem regulären Ausdruck eine beliebige Anzahl unterstützter Domänen hinzufügen können.
quelle
Wenn die Eingabe-URL eine Benutzereingabe ist. Diese Methode gibt den am besten geeigneten Hostnamen an. Wenn nicht gefunden, wird die Eingabe-URL zurückgegeben.
quelle
Alle oben genannten sind gut. Dieser scheint mir wirklich einfach und leicht zu verstehen. Entschuldigen Sie die Zitate. Ich habe es für Groovy in einer Klasse namens DataCenter geschrieben.
Und hier sind einige junit4-Tests:
quelle
Ich habe in allen Fällen unter anderem Guava Library und Regex in Kombination verwendet.
getDomain () kann eine beliebige gängige Methode mit Regex sein.
quelle
Um den tatsächlichen Domainnamen ohne Subdomain zu erhalten, verwende ich:
Beachten Sie, dass dies mit Domains der zweiten Ebene (wie .co.uk) nicht funktioniert.
quelle