2010-11-08 15 views
5

Bu soru başka dillerde ve platformlarda yanıt veriyor ancak C# numaralı telefondan güçlü bir çözüm bulamadım. İşte sonuç aynı olmalıdır vb biz bu yüzden alt alanları, liman, şemada ilgilenmiyorum WHOIS kullandığımız URL'nin parçası içinURL'deki URL'den alan adı ayıkla C#

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

arıyorum zaman whois sahibi aynı şekilde sub1.xyz.com ve sub2.xyz.com'un her ikisi de bir URL'den çıkarmam gereken xyz.com'a aittir.

cevap

6

Aynı şeye ihtiyacım vardı, bu yüzden çözümünüze kopyalayıp yapıştırabileceğiniz bir sınıf yazdım. Tld'nin sabit kodlu bir dizisini kullanır. http://pastebin.com/raw.php?i=VY3DCNhp

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

çıkışları microsoft.com

ve

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

çıkışları microsoft.co.uk

+0

Çalışmanızı paylaştığınız için teşekkür ederiz. Başka bir sorun, listeyi güncel tutmaktır ancak çok sık değiştiğini düşünmüyorum. – Xaqron

+0

Bu sınıf harika. Bugün için güncellenen [PublicSuffix listesinden] (http://publicsuffix.org/list/) tüm TLD'lerin bir listesini sildim. Gönderdiğinizin neredeyse iki katı büyüklükte (~ 6390 kayıt) Değişkeni http://pastebin.com/raw.php?i=PxKWw5jt adresinde bulabilirsiniz. :) Tekrar teşekkürler! :) – moskalak

1

Alabileceğiniz en yakın nokta, sub1.xyz.com bölümünü çıkaracak olan System.Uri.Host özelliğidir. Ne yazık ki, ana bilgisayarın "üst düzey" kısmının tam olarak ne olduğunu bilmek zordur (örneğin, sub1.foo.co.uk versus1.xyz.com adresine bakın)

+0

örneğin .co.uk için iki şey gereklidir, çünkü toplevel olan Emin neredeyse imkansız, ama .info veya .jp 'den başka bir şey gerektirir. [a-zA-Z] {3}' – jcolebrand

+0

[Genel Son Ekleme Listesi] (http: // publicsuffi x.org/) bu tür bir görev için kullanılabilir. Ancak, muhtemelen tüm ana makine adının whois'ını yapmak ve sonuç alıncaya kadar bir segmentte çalışmak en kolay yoldur. – bobince

+0

Bu liste "olmalı" doğru, ama bu benim amacım. "should" büyük bir iş kuralı değil ... – jcolebrand

3

@Pete'in belirttiği gibi, bu biraz karmaşıktır, ancak Bir deneyeyim.

Bu uygulamanın bilinen TLD'lerin tam listesini içermesi gerektiğini unutmayın. Bunlar http://publicsuffix.org/'dan alınabilir. Bu siteden listeyi okuyucuya yönelik bir alıştırma olarak bıraktık.

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

bazı metin eksik – Xaqron

+0

@ Xaqron - Nasıl görmüyorum. Tüm kodu yeni bir Konsol projesine kopyaladım ve doğru bir şekilde derledim ve beklenen sonuçları veriyor. Eksik olduğuna inandığın şey hakkında daha spesifik olabilir misiniz? –

+0

GetDomainFromHostName() yönteminin altında jest eksikti, ancak şimdi var. Teşekkürler. – Xaqron

0

Eğer o zaman regex kullanarak bunları ayrıştırmak gerekir içerikten url gerekiyorsa o zaman .net

yılında URi.hostadress kullanabilirsiniz alan adına gerekirse.