2012-05-24 17 views
5

Los clientes de Out pueden ingresar a sitios web desde nombres de dominio. También pueden ingresar a los mailadresses desde sus contactos.Cadena de análisis para Domain/hostName

Sabemos que tenemos que encontrar clientes cuyo dominio whoose websited se puede asociar a los dominios de los mailadresses.

Así que mi idea es extraer el anfitrión de la webadress y desde la url y compararlos

Entonces, ¿cuál es el algoritmo más fiable para obtener el nombre de host de una URL?

por ejemplo, un host puede ser:

foo.com 
www.foo.com 
http://foo.com 
https://foo.com 
https://www.foo.com 

El resultado debe ser siempre foo.com

+0

derecho, mi error –

+0

modo de aclaración, ya que ha eliminado el ejemplo con el TLD .vu estás diciendo que sólo se preocupan por TLD .com o esto es una simplificación excesiva? –

+0

es una simplificación excesiva. podría ser cualquier tipo de TLD, .de .eu .biz ..... el requisito importante es encontrar posibles candidatos que coincidan con los mailadresses mirando URLs del sitio web –

Respuesta

10

lugar de confiar en el uso de expresiones regulares no fiable System.Uri para hacer el análisis para usted. Utilizar un código como el siguiente:

string uriStr = "www.foo.com"; 
if (!uriStr.Contains(Uri.SchemeDelimiter)) { 
    uriStr = string.Concat(Uri.UriSchemeHttp, Uri.SchemeDelimiter, uriStr); 
} 
Uri uri = new Uri(uriStr); 
string domain = uri.Host; // will return www.foo.com 

ahora para obtener sólo el dominio de nivel superior se puede utilizar:

string tld = uri.GetLeftPart(UriPartial.Authority); // will return foo.com 
+1

no debería dar como resultado solo "com"? – mikesjawnbit

+2

@anubhava: uri.GetLeftPart (UriPartial.Authority) no devuelve el nombre de dominio raíz.En su lugar, devuelve toda la parte izquierda de la URL, comenzando desde el esquema y terminando con el puerto (si se especifica). AFAIK, la única forma de ignorar la porción de subdominio del host es truncarlo explícitamente usando una llamada de 2 pasos a string.LastIndexOf(). –

+0

Actualice answer.string tld no devuelve la raíz. – LikePod

1

He aquí una expresión regular que coincida con la URL que ha proporcionado. Básicamente http y https, etc. son opcionales, al igual que www. Todo se compara con una posible ruta;

var expression = /(https?:\/\/)?(www\.)?([^\/]*)(\/.*)?$/; 

Esto significa que;

var result = 'https://www.foo.com.vu/blah'.replace(expression, '$3') 

evaluaría a

result === 'foo.com.vu' 
+0

la pregunta es qué hay de los subdominios. Creo que no deberían incluirse en el resultado. por lo que product.mycompany.com debería terminar en mycompany.com –

+1

Eso podría ser bastante difícil ya que no se podían contar los puntos para entretener a un subdominio (creo que lo que trato de decir es cosas como .co.uk estropearía las cosas). Probablemente tendrías que hacer dos comprobaciones, una con la expresión anterior y otra con las tiras antes del primer punto – cmilhench

+0

. Esta respuesta falla si evalúas un nombre DNS con caracteres no válidos (como 'a! Notit.com') , o uno con demasiados caracteres (más de 63) –