2009-05-29 15 views

Respuesta

44

Puede utilizar el Uri.TryCreate para validar una dirección URL:

public bool IsValidUri(string uri) 
{ 
    Uri validatedUri; 
    return Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out validatedUri); 
} 

Los comentarios sugieren que TryCreate sólo se mueve el manejo de un nivel más abajo excepción. Sin embargo, revisé el código fuente y encontré que este no es el caso. No hay try/catch dentro de TryCreate, usa un analizador personalizado que no debe arrojarse.

+0

Esto es mejor que las implementaciones try/catch sugeridas. – RichardOD

+0

En caso de que tenga 2.0+, por supuesto ... –

+1

Aunque solo está enterrando el try/catch un nivel más abajo, donde no tiene que verlo. –

0
static bool IsValidUri(string urlString) { 
    try { 
     new Uri(urlString); 
     return true; 
    } catch { 
     return false; 
    } 
} 
+0

Ver el comentario sobre el rendimiento en la respuesta de Divo –

0

Una manera más rápida (probablemente) que usar la funcionalidad try/catch sería usar Regex. Si tuviera que validar miles de URL, la captura de la excepción varias veces sería lenta.

Aquí está a link to sample Regex - use Google para encontrar más.

+0

de alguna manera lo dudo. Las expresiones regulares, incluso compiladas, no son especialmente rápidas. incluso si alguna vez pudieras escribir uno que fuera exacto. – Kris

+0

Esto sería más rápido, pero mucho más difícil de hacer bien. –

+1

Kris: tal vez no comprenda cuán costosas pueden ser las excepciones de lanzamiento, son muy lentas si se hacen en un gran ciclo. – RichardOD

13

Puede utilizar Uri.IsWellFormedUriString, no hay necesidad de crear su propia función para la que:

public static bool IsWellFormedUriString(string uriString, uriKind uriKind); 

Dónde uriKind puede ser:

UriKind.RelativeOrAbsolute 
UriKind.Absolute 
UriKind.Relative 

Para más información ver: http://msdn.microsoft.com/en-us/library/system.uri.iswellformeduristring.aspx

+0

Esto no funciona en muchas situaciones – Farshid

30

Las respuestas proporcionadas hasta el momento no comprueban el esquema, lo que permite todo tipo de entradas no deseadas, lo que podría hacerte vulnerable a la inyección de JavaScript (ver el comentario de TheCloudle). ssSky).

Un URI es solo una identificación única de un objeto. "C: \ Test" es un URI válido.

En mi proyecto he utilizado el siguiente código:

/// <summary> 
/// Validate a URL. 
/// </summary> 
/// <param name="url"></param> 
/// <returns></returns> 
private bool ValidUrl(string url) 
{ 
    Uri validatedUri; 

    if (Uri.TryCreate(url, UriKind.Absolute, out validatedUri)) //.NET URI validation. 
    { 
     //If true: validatedUri contains a valid Uri. Check for the scheme in addition. 
     return (validatedUri.Scheme == Uri.UriSchemeHttp || validatedUri.Scheme == Uri.UriSchemeHttps); 
    } 
    return false; 
} 

Definir qué esquemas va a permitir y cambiar el código en consecuencia.

+1

+1, esta es la mejor respuesta y también la única que realmente responde a la pregunta "cómo validar una URL", una ** URL ** !. – ElektroStudios

Cuestiones relacionadas