2010-11-08 4 views
5

में यूआरएल से डोमेन नाम निकालें इस प्रश्न में अन्य भाषाओं/प्लेटफार्मों में जवाब है लेकिन मुझे C# में एक मजबूत समाधान नहीं मिला। यहाँ मैं आदि यूआरएल जो हम WHOIS में उपयोग करती हैं इसलिए मैं उप डोमेन, बंदरगाह, स्कीमा में कोई दिलचस्पी नहीं है के भाग के लिए देख रहा हूँ,सी #

Example 1: http://s1.website.co.uk/folder/querystring?key=value => website.co.uk 
Example 2: ftp://username:[email protected] => website.com 

परिणाम एक ही होना चाहिए जब whois में स्वामी वही है sub1.xyz.com और sub2.xyz.com दोनों संबंधित हैं जिनके पास xyz.com है जिसे मुझे एक यूआरएल से निकालने की आवश्यकता है।

उत्तर

6

मुझे इसकी आवश्यकता है, इसलिए मैंने एक कक्षा लिखी है जिसे आप कॉपी और पेस्ट कर सकते हैं। यह tld के हार्ड कोडित स्ट्रिंग सरणी का उपयोग करता है। http://pastebin.com/raw.php?i=VY3DCNhp

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.com/path/page.htm")); 

आउटपुट microsoft.com

और

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.co.uk/path/page.htm")); 

आउटपुट microsoft.co.uk

+0

अपना काम साझा करने के लिए धन्यवाद। एक और समस्या सूची को अद्यतन रख रही है लेकिन मुझे नहीं लगता कि यह बहुत बार बदलता है। – Xaqron

+0

यह कक्षा बहुत अच्छी है। मैंने [टीएलडीएस सूची] [http://publicsuffix.org/list/) से सभी टीएलडी की कॉम्पीलीट सूची को आज से अपडेट कर दिया है। आपके द्वारा जमा किए गए एक के रूप में यह लगभग दोगुना बड़ा है (~ 63 9 0 प्रविष्टियां) आप वैरिएबल को http://pastebin.com/raw.php?i=PxKWw5jt पर पा सकते हैं, क्या आपको इसकी आवश्यकता होनी चाहिए। :) एक बार फिर आपका धन्यवाद! :) – moskalak

1

निकटतम आप System.Uri.Host संपत्ति प्राप्त कर सकते हैं, जो sub1.xyz.com भाग निकालेगा। दुर्भाग्यवश, यह जानना मुश्किल है कि मेजबान का "अपूर्ण" भाग क्या है (उदाहरण के लिए sub1.foo.co.uk बनाम sub1.xyz.com)

+0

यह नहीं पता कि कौन उच्चस्तरीय है के लिए पता करने के लिए लगभग असंभव है क्योंकि उदाहरण के लिए .co.uk दो भागों की आवश्यकता है, लेकिन .info या .jp को '। [a-zA-Z] {3} ' – jcolebrand

+0

के अलावा कुछ और चाहिए [सार्वजनिक प्रत्यय सूची] (http: // publicsuffi x.org/) इस प्रकार के कार्य के लिए इस्तेमाल किया जा सकता है। लेकिन यह संभवतः पूरे मेजबान नाम 'व्हाइस' करने के लिए सबसे आसान है और परिणाम प्राप्त होने तक एक समय में एक सेगमेंट का काम करता है। – bobince

+0

वह सूची "सही" होनी चाहिए, लेकिन यह मेरा मुद्दा है। "चाहिए" एक महान व्यापार नियम नहीं है ... – jcolebrand

3

जैसा कि @Pete ने नोट किया, यह थोड़ा जटिल है, लेकिन मै उसे करने की एक कोशिश तो करूंगा।

ध्यान दें कि इस एप्लिकेशन में ज्ञात टीएलडी की पूरी सूची होनी चाहिए। इन्हें http://publicsuffix.org/ से पुनर्प्राप्त किया जा सकता है। पाठक के लिए एक अभ्यास के रूप में इस साइट से सूची निकालने के लिए बाएं।

class Program 
{ 
    static void Main(string[] args) 
    { 
     var testCases = new[] 
     { 
      "www.domain.com.ac", 
      "www.domain.ac", 
      "domain.com.ac", 
      "domain.ac", 
      "localdomain", 
      "localdomain.local" 
     }; 

     foreach (string testCase in testCases) 
     { 
      Console.WriteLine("{0} => {1}", testCase, UriHelper.GetDomainFromUri(new Uri("http://" + testCase + "/"))); 
     } 

     /* Produces the following results: 

      www.domain.com.ac => domain.com.ac 
      www.domain.ac => domain.ac 
      domain.com.ac => domain.com.ac 
      domain.ac => domain.ac 
      localdomain => localdomain 
      localdomain.local => localdomain.local 
     */ 
    } 
} 

public static class UriHelper 
{ 
    private static HashSet<string> _tlds; 

    static UriHelper() 
    { 
     _tlds = new HashSet<string> 
     { 
      "com.ac", 
      "edu.ac", 
      "gov.ac", 
      "net.ac", 
      "mil.ac", 
      "org.ac", 
      "ac" 

      // Complete this list from http://publicsuffix.org/. 
     }; 
    } 

    public static string GetDomainFromUri(Uri uri) 
    { 
     return GetDomainFromHostName(uri.Host); 
    } 

    public static string GetDomainFromHostName(string hostName) 
    { 
     string[] hostNameParts = hostName.Split('.'); 

     if (hostNameParts.Length == 1) 
      return hostNameParts[0]; 

     int matchingParts = FindMatchingParts(hostNameParts, 1); 

     return GetPartOfHostName(hostNameParts, hostNameParts.Length - matchingParts); 
    } 

    private static int FindMatchingParts(string[] hostNameParts, int offset) 
    { 
     if (offset == hostNameParts.Length) 
      return hostNameParts.Length; 

     string domain = GetPartOfHostName(hostNameParts, offset); 

     if (_tlds.Contains(domain.ToLowerInvariant())) 
      return (hostNameParts.Length - offset) + 1; 

     return FindMatchingParts(hostNameParts, offset + 1); 
    } 

    private static string GetPartOfHostName(string[] hostNameParts, int offset) 
    { 
     var sb = new StringBuilder(); 

     for (int i = offset; i < hostNameParts.Length; i++) 
     { 
      if (sb.Length > 0) 
       sb.Append('.'); 

      sb.Append(hostNameParts[i]); 
     } 

     string domain = sb.ToString(); 
     return domain; 
    } 
} 
+0

कुछ पाठ गुम हैं – Xaqron

+0

@Xaqron - मुझे नहीं पता कि कैसे। मैंने पूरे कोड को एक नई कंसोल प्रोजेक्ट में कॉपी किया है और यह सही ढंग से संकलित करता है और अपेक्षित परिणाम देता है। क्या आप कृपया जो कुछ खो रहे हैं उस पर अधिक विशिष्ट हो सकते हैं? –

+0

यह GetDomainFromHostName() विधि के नीचे जेस्ट खो रहा था, लेकिन अब यह है। धन्यवाद। – Xaqron

0

यदि आप डोमेन नाम की जरूरत है तो आप .net

में URi.hostadress उपयोग कर सकते हैं यदि आप सामग्री से यूआरएल की जरूरत है तो आप रेगुलर एक्सप्रेशन का उपयोग कर उन्हें पार्स करने के लिए की जरूरत है।