2010-11-08 19 views
5

Esta pregunta tiene respuesta en otros idiomas/plataformas pero no pude encontrar una solución sólida en C#. Aquí estoy en busca de la parte de la URL que utilizamos en WHOIS así que no estoy interesado en subdominios, puerto, esquemas, etc.Extraiga el nombre de dominio de la URL en C#

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

El resultado debe ser el mismo cuando el dueño de whois es el mismo así que sub1.xyz.com y sub2.xyz.com pertenecen a quien tiene el xyz.com que necesito extraer de una URL.

Respuesta

6

Necesitaba lo mismo, así que escribí una clase que puede copiar y pegar en su solución. Utiliza una matriz de cadenas codificadas de tld. http://pastebin.com/raw.php?i=VY3DCNhp

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

salidas microsoft.com

y

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

salidas microsoft.co.uk

+0

Gracias por compartir tu trabajo. Otro problema es mantener la lista actualizada, pero no creo que cambie con mucha frecuencia. – Xaqron

+0

Esta clase es genial. He incluido una lista compelete de todos los TLD de [la lista PublicSuffix] (http://publicsuffix.org/list/), actualizada para hoy. Es casi dos veces más grande que el que ha enviado (~ 6390 entradas) Puede encontrar la variable en http://pastebin.com/raw.php?i=PxKWw5jt, en caso de que alguna vez lo necesite. :) ¡Gracias otra vez! :) – moskalak

1

Lo más cercano que podría obtener es la propiedad System.Uri.Host, que extraería la parte de sub1.xyz.com. Desafortunadamente, es difícil saber cuál es exactamente la parte "superior" del host (por ejemplo, sub1.foo.co.uk versus sub1.xyz.com)

+0

es casi imposible saber a ciencia cierta cual es el nivel superior, porque, por ejemplo .es requiere de dos partes, pero .info o .jp requieren algo distinto de '. [a-zA-Z] {3}' – jcolebrand

+0

La [Lista de sufijos públicos] (http: // publicsuffi x.org/) se puede usar para este tipo de tarea. Pero probablemente sea más fácil simplemente 'whois' todo el nombre de host y trabajar en un segmento a la vez hasta obtener resultados. – bobince

+0

Esa lista "debería" estar bien, pero ese es mi punto. "should" no es una gran regla de negocios ... – jcolebrand

3

Como señaló @Pete, esto es un poco complicado, pero Lo probaré.

Tenga en cuenta que esta aplicación debe contener una lista completa de TLD conocidos. Se pueden recuperar desde http://publicsuffix.org/. Izquierda extrayendo la lista de este sitio como un ejercicio para el lector.

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

falta texto – Xaqron

+0

@Xaqron - No veo cómo. Copié todo el código en un nuevo proyecto de consola y compila correctamente y da los resultados esperados. ¿Podrías por favor ser más específico sobre lo que crees que falta? –

+0

Faltaba la broma debajo del método GetDomainFromHostName(), pero está allí ahora. Gracias. – Xaqron

0

si necesita nombre de dominio, puede utilizar URi.hostadress en .net

si necesita la URL del contenido, entonces usted necesita para analizar usando expresiones regulares.

Cuestiones relacionadas