c# uri

c# - Obtener solo el nombre de dominio de una URL?



string to uri c# (12)

@Dewfy: el error es que su método devuelve "uk" para "www.test.co.uk" pero el dominio aquí es claramente "test.co.uk".

@naivists: el error es que su método devuelve "beta.microsoft.com" para "www.beta.microsoft.com" pero el dominio aquí es claramente "microsoft.com"

Necesitaba lo mismo, así que escribí una clase que puedes copiar y pegar en tu 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

Estoy tratando de extraer solo el nombre de dominio de una cadena de URL. Casi lo tengo ... estoy usando URI

Tengo una cuerda ... mi primer pensamiento fue usar Regex, pero luego decidí usar la clase URI

http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CAgQFjAA&url=http://www.test.com/&rct=j&q=test&ei=G2phS-HdJJWTjAfckvHJDA&usg=AFQjCNFSEAztaqtkaIvEzxmRm2uOARn1kQ

Necesito convertir lo anterior a google.com y google sin www

Hice lo siguiente

Uri test = new Uri(referrer); log.Info("Domain part : " + test.Host);

Básicamente esto devuelve www.google.com .... me gustaría intentar y devolver 2 formularios si es posible ... como se mencionó ...

google.com y google

¿Es esto posible con URI?


A continuación se muestra un código que proporcionará solo la extensión SLD más gTLD o ccTLD (tenga en cuenta la excepción a continuación). No me importa el DNS.

La teoría es la siguiente:

  • Cualquier cosa menor a 3 tokens permanece como es, por ejemplo, "localhost", "domain.com", de lo contrario: el último token debe ser una extensión de gTLD o ccTLD.
  • El penúltimo token se considera parte de la extensión si su longitud es <3 O si está incluida en una lista de excepciones.
  • Finalmente, el token anterior a ese se considera SLD. Todo lo anterior se considera un subdominio o un calificador de host, por ejemplo, Www.

En cuanto al código, corto y dulce:

private static string GetDomainName(string url) { string domain = new Uri(url).DnsSafeHost.ToLower(); var tokens = domain.Split(''.''); if (tokens.Length > 2) { //Add only second level exceptions to the < 3 rule here string[] exceptions = { "info", "firm", "name", "com", "biz", "gen", "ltd", "web", "net", "pro", "org" }; var validTokens = 2 + ((tokens[tokens.Length - 2].Length < 3 || exceptions.Contains(tokens[tokens.Length - 2])) ? 1 : 0); domain = string.Join(".", tokens, tokens.Length - validTokens, validTokens); } return domain; }

La excepción obvia es que esto no tratará con nombres de dominio de 2 letras. Por lo tanto, si tienes la suerte de ser propietario de ab.com, deberás adaptar el código un poco. Para nosotros simples mortales, este código cubrirá casi todos los gTLD y ccTLD, menos algunos muy exóticos.


Creo que está mostrando un malentendido sobre lo que constituye un "nombre de dominio"; no existe el "nombre de dominio puro" en el uso común; esto es algo que deberá definir si desea obtener resultados consistentes.
¿Solo quieres desnudar la parte "www"? Y luego, tiene otra versión que quita el dominio de nivel superior (por ejemplo, quita las partes ".com" o ".co.uk", etc.) Otra respuesta menciona "split" (".") - necesitarás usar algo de esta manera, si desea excluir partes específicas del nombre de host manualmente, no hay nada dentro del marco de .NET que cumpla con sus requisitos exactamente; deberá implementar estas cosas usted mismo.


Debido a las numerosas variaciones en los nombres de dominio y la inexistencia de una lista autorizada real de lo que constituye un "nombre de dominio puro" como usted describe, acabo de recurrir al uso de Uri.Host en el pasado. Para evitar casos en los que www.google.com y google.com aparecen como dos dominios diferentes, a menudo he recurrido a eliminar el www. de todos los dominios que lo contienen, ya que está casi garantizado (ALMOST) apuntar al mismo sitio. Realmente es la única manera simple de hacerlo sin arriesgar perder algunos datos.


El host de Uri siempre devuelve el dominio (www.google.com), incluida una etiqueta (www) y un dominio de nivel superior (com). Pero a menudo querrás extraer el bit del medio. Simplemente lo hago

Uri uri; bool result = Uri.TryCreate(returnUri, UriKind.Absolute, out uri); if (result == false) return false; //if you are sure it''s not "localhost" string domainParts = uri.Host.Split(''.''); string topLevel = domainParts[domainParts.Length - 1] string hostBody = domainParts[domainParts.Length - 2] string label = domainParts[domainParts.Length - 3]

Pero es necesario que compruebe domainParts.length, ya que a menudo el uri dado es como "google.com".


Probé casi todos los enfoques, pero ninguno de ellos alcanzó el resultado deseado. Así que aquí está mi enfoque ajustado desde servermanfail.

El archivo tld está disponible en https://publicsuffix.org/list/ Tomé el archivo de https://publicsuffix.org/list/effective_tld_names.dat analizo y busco el tld. Si se publican nuevos tld, simplemente descargue el archivo más reciente.

que te diviertas.

using System; using System.Collections.Generic; using System.IO; namespace SearchWebsite { internal class NetDomain { static public string GetDomainFromUrl(string Url) { return GetDomainFromUrl(new Uri(Url)); } static public string GetDomainFromUrl(string Url, bool Strict) { return GetDomainFromUrl(new Uri(Url), Strict); } static public string GetDomainFromUrl(Uri Url) { return GetDomainFromUrl(Url, false); } static public string GetDomainFromUrl(Uri Url, bool Strict) { initializeTLD(); if (Url == null) return null; var dotBits = Url.Host.Split(''.''); if (dotBits.Length == 1) return Url.Host; //eg http://localhost/blah.php = "localhost" if (dotBits.Length == 2) return Url.Host; //eg http://blah.co/blah.php = "localhost" string bestMatch = ""; foreach (var tld in DOMAINS) { if (Url.Host.EndsWith(tld, StringComparison.InvariantCultureIgnoreCase)) { if (tld.Length > bestMatch.Length) bestMatch = tld; } } if (string.IsNullOrEmpty(bestMatch)) return Url.Host; //eg http://domain.com/blah = "domain.com" //add the domain name onto tld string[] bestBits = bestMatch.Split(''.''); string[] inputBits = Url.Host.Split(''.''); int getLastBits = bestBits.Length + 1; bestMatch = ""; for (int c = inputBits.Length - getLastBits; c < inputBits.Length; c++) { if (bestMatch.Length > 0) bestMatch += "."; bestMatch += inputBits[c]; } return bestMatch; } static private void initializeTLD() { if (DOMAINS.Count > 0) return; string line; StreamReader reader = File.OpenText("effective_tld_names.dat"); while ((line = reader.ReadLine()) != null) { if (!string.IsNullOrEmpty(line) && !line.StartsWith("//")) { DOMAINS.Add(line); } } reader.Close(); } // This file was taken from https://publicsuffix.org/list/effective_tld_names.dat static public List<String> DOMAINS = new List<String>(); }

}


Sí, es posible su uso:

Uri.GetLeftPart( UriPartial.Authority )


Sí, he publicado la solución aquí: http://pastebin.com/raw.php?i=raxNQkCF

Si desea eliminar la extensión simplemente agregue

if (url.indexof(".")>-1) {url = url.substring(0, url.indexof("."))}


Use Nager.PublicSuffix

paquete de instalación Nager.PublicSuffix

var domainParser = new DomainParser(new WebTldRuleProvider()); var domainName = domainParser.Get("sub.test.co.uk"); //domainName.Domain = "test"; //domainName.Hostname = "sub.test.co.uk"; //domainName.RegistrableDomain = "test.co.uk"; //domainName.SubDomain = "sub"; //domainName.TLD = "co.uk";



google.com no garantiza que sea igual que www.google.com (bueno, técnicamente para este ejemplo, pero puede ser de otro modo).

tal vez lo que necesita es eliminar el dominio "nivel superior" y el subdominio "www" ¡Entonces solo split(''.'') Y toma la parte antes de la última parte!


string domain = new Uri(HttpContext.Current.Request.Url.AbsoluteUri).GetLeftPart(UriPartial.Authority);