Biorąc pod uwagę adres URL, chcę wyodrębnić nazwę domeny (nie powinna zawierać części „www”). Adres URL może zawierać http / https. Oto kod java, który napisałem. Chociaż wydaje się, że działa dobrze, czy jest jakieś lepsze podejście lub są jakieś skrajne przypadki, które mogą się nie udać.
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;
}
Wejście: http://google.com/blah
Wyjście: google.com
http://74.125.226.70
i daj mi znać, jak to działa :)http://www.de/
lubhttp://www.com/
nie przyniesie pożądanych rezultatów.Odpowiedzi:
Jeśli chcesz przeanalizować adres URL, użyj
java.net.URI
.java.net.URL
ma wiele problemów - jegoequals
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.powinieneś robić, co chcesz.
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ę odhttp
.HTTP://example.com/
- protokół nie rozróżnia wielkości liter.//example.com/
- adres URL protokołu z hostemwww/foo
- względny adres URL ze składnikiem ścieżki zaczynającym się odwww
wwwexample.com
- nazwa domeny, która nie zaczyna się od,www.
ale zaczyna się odwww
.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:źródło
www.google.com
to względny adres URL ze składnikiem ścieżki, którym jestwww.google.com
. Na przykład, jeśli zostanie rozwiązany przeciwkohttp://example.com/
, otrzymaszhttp://example.com/www.google.com
.Czytaj więcej
źródło
Oto krótka i prosta linia używana
InternetDomainName.topPrivateDomain()
w guawie:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Biorąc pod uwagę
http://www.google.com/blah
, że to ci dagoogle.com
. Albo, biorąc pod uwagęhttp://www.google.co.mx
, da cigoogle.co.mx
.Jak skomentował Sa Qada w innej odpowiedzi na ten post , to pytanie zostało zadane wcześniej: Wyodrębnij nazwę domeny głównej z podanego adresu URL . Najlepszą odpowiedzią na to pytanie jest od Satya , który sugeruje guawy za InternetDomainName.topPrivateDomain ()
Połączenie tego z tym
URL.getHost()
, co zawiera już oryginalny post, daje:źródło
Napisałem metodę (patrz poniżej), która wyodrębnia nazwę domeny adresu URL i używa prostego dopasowania String. W rzeczywistości wyodrębnia bit między pierwszym
"://"
(lub indeksem,0
jeśli nie ma go"://"
zawartego), a pierwszym kolejnym"/"
(lub indeksem,String.length()
jeśli nie ma kolejnego"/"
). Pozostały, poprzedni"www(_)*."
bit jest odcinany. Jestem pewien, że będą przypadki, w których to nie będzie wystarczająco dobre, ale w większości przypadków powinno być wystarczająco dobre!Powyższy post Mike'a Samuela mówi, że
java.net.URI
klasa mogła to zrobić (i była preferowana niżjava.net.URL
klasa), ale napotkałem problemy zURI
klasą. W szczególnościURI.getHost()
daje wartość null, jeśli adres URL nie zawiera schematu, tj."http(s)"
Bit.źródło
http://bob.com:8080/service/read?name=robert
Zrobiłem mały zabieg po utworzeniu obiektu URI
źródło
W moim przypadku potrzebowałem tylko domeny głównej, a nie subdomeny (bez „www” lub jakiejkolwiek subdomeny):
Dzięki tej metodzie adres URL „ https://rest.webtoapp.io/llSlider?lg=en&t=8 ” będzie miał dla domeny „webtoapp.io”.
źródło
spróbuj tego: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (nowy adres URL („ https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains ”)));
źródło
Jest podobne pytanie Wyodrębnij nazwę domeny głównej z podanego adresu URL . Jeśli spojrzysz na tę odpowiedź , zobaczysz, że jest to bardzo łatwe. Wystarczy użyć
java.net.URL
iString
narzędzia -Split
źródło
Objaśnienie: wyrażenie regularne ma 4 grupy. Pierwsze dwie to niepasujące grupy, a kolejne dwie to pasujące grupy.
Pierwsza niepasująca grupa to „http”, „https” lub „”
Druga niepasująca grupa to „www”. lub „”
Druga pasująca grupa to domena najwyższego poziomu
Pierwsza pasująca grupa to cokolwiek po niepasujących grupach i wszystko przed domeną najwyższego poziomu
Połączenie dwóch pasujących grup da nam nazwę domeny / hosta.
PS: Pamiętaj, że do wyrażenia regularnego możesz dodać dowolną liczbę obsługiwanych domen.
źródło
Jeśli wejściowy adres URL jest wprowadzany przez użytkownika. ta metoda daje najbardziej odpowiednią nazwę hosta. jeśli nie znaleziono, zwraca wejściowy adres URL.
źródło
Wszystkie powyższe są dobre. Ten wydaje mi się naprawdę prosty i łatwy do zrozumienia. Przepraszam za cytaty. Napisałem to dla Groovy w klasie o nazwie DataCenter.
A oto kilka testów junit4:
źródło
Jednym ze sposobów, w jaki zrobiłem i pracowałem dla wszystkich przypadków, jest połączenie biblioteki Guava i wyrażenia regularnego.
getDomain () może być dowolną popularną metodą z wyrażeniem regularnym.
źródło
Aby uzyskać rzeczywistą nazwę domeny, bez subdomeny, używam:
Pamiętaj, że to nie zadziała w przypadku domen drugiego poziomu (takich jak .co.uk).
źródło