Wenn Sie eine URL analysieren möchten, verwenden Sie java.net.URI. java.net.URLhat eine Reihe von Problemen - seine equalsMethode 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.URIstattdessen zu verwenden.
public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
sollte tun was du willst.
Obwohl es gut zu funktionieren scheint, gibt es einen besseren Ansatz oder gibt es einige Randfälle, die fehlschlagen könnten.
Ihr geschriebener Code schlägt für die gültigen URLs fehl:
httpfoo/bar- relative URL mit einer Pfadkomponente, die mit beginnt http.
HTTP://example.com/ - Das Protokoll unterscheidet nicht zwischen Groß- und Kleinschreibung.
//example.com/ - Protokoll relative URL mit einem Host
www/foo - eine relative URL mit einer Pfadkomponente, die mit beginnt www
wwwexample.com- Domainname, der nicht mit, www.sondern mit beginnt www.
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.URIzurückweisen, lesen Sie RFC 3986 Anhang B:
Anhang B. Analysieren einer URI-Referenz mit einem regulären Ausdruck
Da der "First-Match-Wins" -Algorithmus mit der von POSIX-regulären Ausdrücken verwendeten "gierigen" Disambiguierungsmethode identisch ist, ist es natürlich und üblich, einen regulären Ausdruck zum Parsen der potenziellen fünf Komponenten einer URI-Referenz zu verwenden.
Die folgende Zeile ist der reguläre Ausdruck zum Aufteilen einer wohlgeformten URI-Referenz in ihre Komponenten.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Die Zahlen in der zweiten Zeile oben dienen nur zur besseren Lesbarkeit. Sie geben die Referenzpunkte für jeden Unterausdruck an (dh jede gepaarte Klammer).
http://74.125.226.70und lassen Sie mich wissen, wie das funktioniert :)