Jeśli chcesz przeanalizować adres URL, użyj java.net.URI
. java.net.URL
ma wiele problemów - jego equals
metoda wyszukuje DNS, co oznacza, że wykorzystujący ją kod może być podatny na ataki typu „odmowa usługi”, gdy jest używany z niezaufanymi danymi wejściowymi.
"Panie Gosling - dlaczego sprawiłeś, że adres URL jest do niczego?" wyjaśnia jeden taki problem. Po prostu nabądź zwyczaju używania java.net.URI
zamiast tego.
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;
}
powinieneś robić, co chcesz.
Chociaż wydaje się, że działa dobrze, czy jest jakieś lepsze podejście lub są jakieś skrajne przypadki, które mogą się nie udać.
Zapisany kod nie działa w przypadku prawidłowych adresów URL:
httpfoo/bar
- względny adres URL ze składnikiem ścieżki zaczynającym się od http
.
HTTP://example.com/
- protokół nie rozróżnia wielkości liter.
//example.com/
- adres URL protokołu z hostem
www/foo
- względny adres URL ze składnikiem ścieżki zaczynającym się od www
wwwexample.com
- nazwa domeny, która nie zaczyna się od, www.
ale zaczyna się od www
.
Hierarchiczne adresy URL mają złożoną gramatykę. Jeśli spróbujesz zmienić swój własny parser bez uważnego czytania RFC 3986, prawdopodobnie popełnisz błąd. Po prostu użyj tego, który jest wbudowany w podstawowe biblioteki.
Jeśli naprawdę potrzebujesz radzić sobie z niechlujnymi danymi wejściowymi, które java.net.URI
odrzucają, zobacz RFC 3986 Dodatek B:
Dodatek B. Analiza odwołania URI za pomocą wyrażenia regularnego
Ponieważ algorytm „pierwsze dopasowanie wygrywa” jest identyczny z „zachłanną” metodą ujednoznaczniania używaną przez wyrażenia regularne POSIX, naturalne i powszechne jest użycie wyrażenia regularnego do analizy potencjalnych pięciu składników odwołania URI.
Poniższy wiersz zawiera wyrażenie regularne służące do rozbicia poprawnie sformułowanego odwołania URI na jego składniki.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Liczby w drugim wierszu powyżej służą jedynie do ułatwienia czytelności; wskazują punkty odniesienia dla każdego wyrażenia podrzędnego (tj. każdego sparowanego nawiasu).
http://74.125.226.70
i daj mi znać, jak to działa :)