c# - solo - ¿Cómo comprobar si una cadena es una URL HTTP válida?
expresiones regulares para nombres (7)
Existen los métodos Uri.IsWellFormedUriString
y Uri.TryCreate
, pero parecen devolver true
para rutas de archivos, etc.
¿Cómo compruebo si una cadena es una URL HTTP válida (no necesariamente activa) para propósitos de validación de entrada?
Después de Uri.TryCreate
puede verificar Uri.Scheme
para ver si es HTTP (s).
Este método funciona bien tanto en http como en https. Sólo una línea :)
if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))
MSDN: IsWellFormedUriString
Esto devolvería bool:
Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
Intente esto para validar las URL de HTTP ( uriName
es el URI que desea probar):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp;
O, si desea aceptar las URL de HTTP y HTTPS como válidas (según el comentario de J0e3gan):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
Todas las respuestas aquí permiten URL con otros esquemas (por ejemplo, file://
, ftp://
) o rechazan URL legibles para las personas que no comienzan con http://
o https://
(por ejemplo, www.google.com
) que no es bueno cuando se trata de entradas de usuario .
Así es como lo hago:
public static bool ValidHttpURL(string s, out Uri resultURI)
{
if (!Regex.IsMatch(s, @"^https?:////", RegexOptions.IgnoreCase))
s = "http://" + s;
if (Uri.TryCreate(s, UriKind.Absolute, out resultURI))
return (resultURI.Scheme == Uri.UriSchemeHttp ||
resultURI.Scheme == Uri.UriSchemeHttps);
return false;
}
Uso:
string[] inputs = new[] {
"https://www.google.com",
"http://www.google.com",
"www.google.com",
"google.com",
"javascript:alert(''Hack me!'')"
};
foreach (string s in inputs)
{
Uri uriResult;
bool result = ValidHttpURL(s, out uriResult);
Console.WriteLine(result + "/t" + uriResult?.AbsoluteUri);
}
Salida:
True https://www.google.com/
True http://www.google.com/
True http://www.google.com/
True http://google.com/
False
public static bool CheckURLValid(this string source)
{
Uri uriResult;
return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
}
Uso:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
ACTUALIZACIÓN: (única línea de código) Gracias @GoClimbColorado
public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;
Uso:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
return false;
else
return true;
Aquí url
es la cadena que tienes que probar.