2010-07-24 23 views
7

Necesito analizar el nombre de dominio de una cadena. La cadena puede variar y necesito el dominio exacto.¿Cómo usar una expresión regular de C# para analizar un nombre de dominio?

ejemplos de cadenas:

http://somename.de/ 
www.somename.de/ 
somename.de/ 
somename.de/somesubdirectory 
www.somename.de/?pe=12 

lo necesito en el siguiente formato con sólo el nombre de dominio, el tld y el www, en su caso:

www.somename.de 

¿Cómo hago eso usando C#?

+0

hola gracias por hacerlo más claro – Neutralizer

Respuesta

10

i simple usado

Uri uri = new Uri("http://www.google.com/search?q=439489"); 
      string url = uri.Host.ToString(); 
      return url; 

ya que al usar este seguro que puede.

2

Revisé Regular Expression Library, y parece que algo como esto podría funcionar para usted:

^(([\w][\w\-\.]*)\.)?([\w][\w\-]+)(\.([\w][\w\.]*))?$ 
+0

no esto no está funcionando – Neutralizer

+2

@Umair Ashraf - probablemente debería explicar cómo no funciona. ¿Puedes dar un ejemplo de una línea que no concuerde? – Kobi

+1

Cómo no funciona: no elimina el protocolo, por ejemplo ('http: //'). – Wrikken

1

Prueba esto:

^(?:\w+://)?([^/?]*) 

esto es una expresión regular débil - que no valida la cadena, pero supone que ya es una url, y obtiene la primera palabra, hasta la primera barra, sin tener en cuenta el protocolo. Para obtener el aspecto de dominio en el primer grupo capturado, por ejemplo:

string url = "http://www.google.com/hello"; 
Match match = Regex.Match(url, @"^(?:\w+://)?([^/?]*)"); 
string domain = match.Groups[1].Value; 

Como beneficio adicional, también captura hasta la primera ?, por lo que la url google.com?hello=world funcionará como se espera.

13

Como alternativa a una solución de expresiones regulares, puede dejar que la clase System.Uri analice la cadena por usted. Solo tienes que asegurarte de que la cadena contiene un esquema.

string uriString = "http://www.google.com/search"; 

if (!uriString.Contains(Uri.SchemeDelimiter)) 
{ 
    uriString = string.Concat(Uri.UriSchemeHttp, Uri.SchemeDelimiter, uriString); 
} 

string domain = new Uri(uriString).Host; 

Esta solución también filtra los números de puerto y convierte las direcciones IPv6 a su forma canónica.

+1

Sus respuestas también son válidas. – Neutralizer

+1

No funciona para "http: // blabla" alguna idea de cómo suponemos manejar este –

+0

@ AbdulSaboor, ¿qué esperarías? La URL contiene un nombre de host con un espacio ("blabla") que lo convierte en un nombre de host no válido. Solo el "http: //" también es una URL inválida. El constructor 'Uri' espera una URL válida. –

Cuestiones relacionadas