Jeśli chcesz przeanalizować adres URL, użyj java.net.URI. java.net.URLma wiele problemów - jego equalsmetoda 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.URIzamiast 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.URIodrzucają, 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.70i daj mi znać, jak to działa :)