2011-01-27 18 views
5

kullanarak Kamu Soneki çıkarma uygulanması ve ben onun http://publicsuffix.org/index.htmli bir url üst etki alanını ayıklamak gerekir java

ve java uygulaması http://guava-libraries.googlecode.com olduğunu ve ı, alan adı

ayıklamak için herhangi bir örnek bulamadık var herhangi bir i bir örnekle bu kütüphaneyi kullanan uygulamaya nasıl bana söyleyebilir
say example.. 
example.google.com 
returns google.com 

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

....

+0

[TLD ] (http://en.wikipedia.org/wiki/Top-level_domain) (".com" bölümü) ve [SLD] (http://en.wikipedia.org/wiki/Second-level_dom) ain) ("google" veya "bing" kısmı) URL’lerden mi? –

+0

Sadece etki alanının son iki bölümünü istiyorsanız, parçaları almak ve son ikisine dönmek için sadece 'String.split (' \\. ') 'Yapamazdınız mı? Ya da uygun dizinden çıktıktan sonra (kolayca) bir 'String.substring (indexOfPenultimatePeriod)' yapın? Buradaki karmaşıklık nedir? –

+0

ikinci düzey etki alanı bölümü ... – ramuvan

cevap

15

istediğini tam yapar. Guava, ev sahibinin ortak eki bölümünün ne olduğunu belirlemek için kullandığı kamu eklerinin listesini (Mozilla'nın publicsuffix.org'daki listesini temel alır) kullanır.

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 ve Genel Suffix aynı değildir. Örneğin 'http://myblog.blogspot.com -> myblog.blogspot.com'. Daha fazla bilgi için [this] (https://code.google.com/p/guava-libraries/wiki/InternetDomainNameExplained) 'ı okuyun – gamliela

+0

Neden 's3.amazonaws.com' null değerini döndürüyor? – byteBiter

+1

@ Lilan: 's3.amazonaws.com'nın kendisi bir genel ek: https://publicsuffix.org/list/effective_tld_names.dat – ColinD

1

DÜZENLEME: Üzgünüm biraz fazla hızlı oldum. Ben co.jp.'yi düşünmedim. co.uk, vb. Bir yerden olası TLD'lerin bir listesini almanız gerekecektir. TLD'yi doğrulamak için http://commons.apache.org/validator/'a da bakabilirsiniz.

Bunun gibi bir şeyin işe yarayacağını düşünüyorum: Ama belki de bazı Java-Standart İşlevleri var. Bu InternetDomainName.topPrivateDomain() gibi görünüyor bana

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

lütfen bu url http://maps.foobar.co.jp/someFolder/index.html – ramuvan

+0

ile test edin, üzgünüm, co.jp, co.uk ve benzeri düşünmedim. Muhtemelen TLD'lerin bir listesini almalı ve bunları String ile eşleştirmelisiniz. –

+0

Guava, TLD listesi değiştikçe yeni sürümlerle güncellenecek bir dahili TLD listesi de dahil olmak üzere bunu yapmak için işlevselliğe sahiptir. Bunun üzerine Java, ayrıştırmak ve URL'nin ana bilgisayar bölümünü almak için işlevler geliştirdi ... Bence 'split' ile manuel olarak ayrıştırmak iyi bir fikir değil. – ColinD

1

Geçenlerde bir Public Suffix List API uygulanan: Bu kod baskılar Running

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(); 
    } 
} 

: Burada

size kısa bir örnek ayıklamak arıyorsanız, So

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

S3.amazonaws.com' niçin null döndürdüğünü biliyor musunuz? – byteBiter

+0

[PSL] (https://publicsuffix.org/), s3.amazonaws.com öğesini bir genel sonek olarak kabul eder. –