2011-01-27 16 views
5

muszę wyodrębnić górną domenę url i mam jego http://publicsuffix.org/index.htmlrealizacji ekstrakcji sufiksu publiczny przy użyciu języka Java

i wdrożenie Java jest w http://guava-libraries.googlecode.com i nie mogłem znaleźć Wszelkie przykład wyodrębnić nazwy domeny

say example.. 
example.google.com 
returns google.com 

and bing.bing.bing.com 
returns bing.com 

może ktoś mi powiedzieć, w jaki sposób można realizować przy użyciu tej biblioteki na przykładzie ....

+0

Więc szukasz extract [TLD ] (http://en.wikipedia.org/wiki/Top-level_domain) (część ".com") i [SLD] (http://en.wikipedia.org/wiki/Second-level_dom ain) (część "google" lub "bing") z adresów URL? –

+0

Jeśli chcesz tylko dwie ostatnie części domeny, czy nie możesz po prostu 'String.split ('\\.')' Dostać części i zwrócić ostatnie dwa? Lub wykonaj 'String.substring (indexOfPenultimatePeriod)' po (łatwo) wypracowanie odpowiedniego indeksu? Jaka jest złożoność tutaj? –

+0

część domeny drugiego poziomu ... – ramuvan

Odpowiedz

15

To mi wygląda InternetDomainName.topPrivateDomain() robi dokładnie co chcesz. Guava utrzymuje listę publicznych sufiksów (opartych na liście Mozilli na publicsuffix.org), których używa do określenia, co jest częścią sufiksów publicznych hosta ... górna domena prywatna to publiczny sufiks i jego pierwsze dziecko.

Oto krótki przykład:

public class Test { 
    public static void main(String[] args) throws URISyntaxException { 
    ImmutableList<String> urls = ImmutableList.of(
     "http://example.google.com", "http://google.com", 
     "http://bing.bing.bing.com", "http://www.amazon.co.jp/"); 
    for (String url : urls) { 
     System.out.println(url + " -> " + getTopPrivateDomain(url)); 
    } 
    } 

    private static String getTopPrivateDomain(String url) throws URISyntaxException { 
    String host = new URI(url).getHost(); 
    InternetDomainName domainName = InternetDomainName.from(host); 
    return domainName.topPrivateDomain().name(); 
    } 
} 

Running ten kod wydruki:

http://example.google.com -> google.com 
http://google.com -> google.com 
http://bing.bing.bing.com -> bing.com 
http://www.amazon.co.jp/ -> amazon.co.jp
+1

TLD i Public Suffix to nie to samo. Na przykład 'http://myblog.blogspot.com -> myblog.blogspot.com'. Przeczytaj [to] (https://code.google.com/p/guava-libraries/wiki/InternetDomainNameExplained), aby uzyskać więcej szczegółów. – gamliela

+0

Czy wiesz, dlaczego 's3.amazonaws.com' zwraca zero? – byteBiter

+1

@Liquid: 's3.amazonaws.com' jest samo w sobie publicznym sufiksem: https://publicsuffix.org/list/effective_tld_names.dat – ColinD

1

EDIT: Niestety byłem trochę zbyt szybko. Nie myślałem o co.jp. co.uk, i tak dalej. Będziesz musiał zdobyć listę możliwych TLD skądś. Możesz również sprawdzić, czy namożna sprawdzić poprawność TLD.

Myślę, że coś takiego powinno zadziałać: Ale może istnieje trochę funkcji standardowej Java.

String url = "http://www.foobar.com/someFolder/index.html"; 
if (url.contains("://")) { 
    url = url.split("://")[1]; 
} 

if (url.contains("/")) { 
    url = url.split("/")[0]; 
} 

// You need to get your TLDs from somewhere... 
List<String> magicListofTLD = getTLDsFromSomewhere(); 

int positionOfTLD = -1; 
String usedTLD = null; 
for (String tld : magicListofTLD) { 
    positionOfTLD = url.indexOf(tld); 
    if (positionOfTLD > 0) { 
    usedTLD = tld; 
    break; 
    } 
} 

if (positionOfTLD > 0) { 
    url = url.substring(0, positionOfTLD); 
} else { 
    return; 
} 
String[] strings = url.split("\\."); 

String foo = strings[strings.length - 1] + "." + usedTLD; 
System.out.println(foo); 
+0

proszę przetestować pod tym adresem http://maps.foobar.co.jp/someFolder/index.html – ramuvan

+0

tak, przepraszam, nie myślałem o co.jp, co.uk i tak dalej. Chyba musisz zdobyć listę możliwych TLD i spróbować dopasować je do String. –

+0

Guava ma wbudowaną funkcjonalność do tego celu, w tym wewnętrzną listę TLD, która będzie aktualizowana o nowe wersje wraz z zmianą listy TLD. Co więcej, Java ma wbudowaną funkcjonalność do parsowania i pobierania części adresu URL ... Nie sądzę, że parsowanie jej ręcznie za pomocą 'split' jest dobrym pomysłem. – ColinD

1

Niedawno wdrożył Public Suffix List API:

PublicSuffixList suffixList = new PublicSuffixListFactory().build(); 

assertEquals(
    "google.com", suffixList.getRegistrableDomain("example.google.com")); 

assertEquals(
    "bing.com", suffixList.getRegistrableDomain("bing.bing.bing.com")); 

assertEquals(
    "amazon.co.jp", suffixList.getRegistrableDomain("www.amazon.co.jp")); 
+0

Czy wiesz, dlaczego 's3.amazonaws.com' zwraca zero? – byteBiter

+0

[PSL] (https://publicsuffix.org/) uważa 's3.amazonaws.com' za publiczny przyrostek. –

Powiązane problemy