2011-01-27 7 views
5

का उपयोग कर मैं एक यूआरएल के शीर्ष डोमेन को निकालने के लिए की जरूरत है सार्वजनिक प्रत्यय निष्कर्षण और मुझे मिल गया उसकी http://publicsuffix.org/index.htmlको लागू जावा

और जावा कार्यान्वयन http://guava-libraries.googlecode.com में है और मैं किसी भी उदाहरण डोमेन नाम

निकालने के लिए नहीं मिल सका
say example.. 
example.google.com 
returns google.com 

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

किसी भी एक मुझे बता सकते हैं मैं कैसे एक उदाहरण के साथ इस लाइब्रेरी का उपयोग कर लागू कर सकते हैं ....

+0

तो, आप को निकालने के लिए देख रहे हैं [टीएलडी ] (http://en.wikipedia.org/wiki/Top-level_domain) ('.com' भाग) और [एसएलडी] (http://en.wikipedia.org/wiki/Second-level_dom ऐन) (यूआरएल से 'google' या' bing' भाग)? –

+0

यदि आप डोमेन के आखिरी दो हिस्सों को चाहते हैं, तो क्या आप भागों को पाने और पिछले दो को वापस करने के लिए 'String.split (' \\। ') नहीं कर सकते थे? या उपयुक्त सूचकांक के बाद (आसानी से) काम करने के बाद 'String.substring (indexOfPenultimatePeriod) 'करें? यहां जटिलता क्या है? –

+0

द्वितीय स्तर के डोमेन भाग ... – ramuvan

उत्तर

15

यह InternetDomainName.topPrivateDomain() की तरह मुझे लग रहा है बिल्कुल करता है कि आप क्या चाहते। अमरूद सार्वजनिक प्रत्ययों की एक सूची बनाए रखता है (प्रकाशिकीफिक्स.org पर मोज़िला की सूची के आधार पर) यह यह निर्धारित करने के लिए उपयोग करता है कि मेजबान का सार्वजनिक प्रत्यय हिस्सा क्या है ... शीर्ष निजी डोमेन सार्वजनिक प्रत्यय और इसके पहले बच्चे हैं।

यहां एक त्वरित उदाहरण है:

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

चल रहा है इस कोड को प्रिंट:

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

टीएलडी और सार्वजनिक प्रत्यय समान नहीं हैं। उदाहरण के लिए 'http://myblog.blogspot.com -> myblog.blogspot.com'। अधिक जानकारी के लिए [यह] (https://code.google.com/p/guava-libraries/wiki/InternetDomainNameExplained) पढ़ें – gamliela

+0

क्या आपको पता है कि 's3.amazonaws.com' एक शून्य क्यों देता है? – byteBiter

+1

@ तरल: 's3.amazonaws.com' स्वयं सार्वजनिक प्रत्यय है: https://publicsuffix.org/list/effective_tld_names।दिनांक – ColinD

1

संपादित करें: माफ करना, मैं एक छोटे से बहुत तेजी से किया गया है। मैंने co.jp के बारे में नहीं सोचा था co.uk, और इतने पर। आपको कहीं से संभावित टीएलडी की एक सूची प्राप्त करने की आवश्यकता होगी। आप टीएलडी को सत्यापित करने के लिए http://commons.apache.org/validator/ पर भी एक नज़र डाल सकते हैं।

मुझे लगता है कि ऐसा कुछ काम करना चाहिए: लेकिन हो सकता है कि कुछ जावा-मानक फ़ंक्शन मौजूद हों।

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

कृपया इस यूआरएल के साथ परीक्षण करें http://maps.foobar.co.jp/someFolder/index.html – ramuvan

+0

हाँ, क्षमा करें, co.jp, co.uk और इसी तरह के बारे में नहीं सोचा था। मुझे लगता है कि आपको संभावित टीएलडी की एक सूची प्राप्त करनी है और स्ट्रिंग के साथ मिलान करने का प्रयास करना है। –

+0

अमरूद ने ऐसा करने के लिए कार्यक्षमता में बनाया है, जिसमें एक आंतरिक टीएलडी सूची भी शामिल है जिसे टीएलडी सूची में बदलाव के रूप में नई रिलीज के साथ अपडेट किया जाएगा। इसके शीर्ष पर, जावा ने पार्सिंग के लिए कार्यक्षमता में बनाया है और यूआरएल का मेजबान हिस्सा प्राप्त कर रहा है ... मुझे नहीं लगता कि इसे 'स्प्लिट' के साथ मैन्युअल रूप से पार्स करना एक अच्छा विचार है। – ColinD

1

मैं हाल ही में एक 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

क्या आप जानते हैं कि 's3.amazonaws.com' एक शून्य क्यों देता है? – byteBiter

+0

[पीएसएल] (https://publicsuffix.org/) 's3.amazonaws.com' को सार्वजनिक प्रत्यय के रूप में मानता है। –

संबंधित मुद्दे