¿Cómo verificar si una cadena es una URL HTTP válida?

Respuestas:

452

Pruebe esto para validar las URL HTTP ( uriNamees 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 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);
Arabela Paslaru
fuente
66
¿Debería leer esto uriResult.Scheme en lugar de uriName.Scheme? Estoy usando la sobrecarga para TryCreate que toma String en lugar de Uri como primer parámetro.
77
Es posible que desee agregar más condiciones a uriResult.Scheme == ... Específicamente https. Depende de para qué lo necesites, pero este pequeño cambio fue todo lo que necesitaba para que funcionara perfectamente para mí.
Fiarr
11
Para que quede claro según el comentario de @ Fiarr, el "pequeño cambio" necesario para tener en cuenta HTTPS además de las URL HTTP es:bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
J0e3gan
3
de esta manera falla para URL como abcde . Dice que esta es una URL válida.
Kailash P
77
Parece que esta técnica falla 22 de 75 pruebas dotnetfiddle.net/XduN3A
whitneyland
98

Este método funciona bien tanto en http como en https. Solo una línea :)

if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))

MSDN: IsWellFormedUriString

Kishath
fuente
13
Esto devolverá el valor verdadero para URI que no sean HTTP (es decir, cualquier otro esquema como file://o ldap://. Esta solución debe combinarse con una verificación contra el esquema, por ejemploif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
Squiggle
¿Cumple esto con RFC3986?
Marcus
3
@Squiggle Eso es exactamente lo que quiero que compruebe, todo desde que estoy haciendo un Downloader. Entonces, esta respuesta es el mejor método para mí.
Beyondo
24
    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: (línea única 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
}
Erçin Dedeoğlu
fuente
Esto no parece manejar las URL de www. IE: www.google.com se muestra como no válido.
Zauber Paracelsus
66
@ZauberParacelsus "www.google.com" no es válido. La URL debe comenzar con "http", "ftp", "archivo", etc. la cadena debe ser "http: // www.google.com" sin espacio
Erçin Dedeoğlu
1
Hoy, el parámetro out puede hacer una mejoraUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado
11

Todas las respuestas aquí permiten URL con otros esquemas (p. Ej. file://, ftp://) O rechazan las URL legibles por humanos que no comienzan con http://o https://(p. Ej. www.google.com) , Lo 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
Ahmed Abdelhameed
fuente
1
Esto deja pasar palabras sueltas como "mooooooooo" pero usado junto con Uri.IsWellFormedUriString podría ser bueno
Epirocks
@Epirocks Ese es un buen punto. El problema es que http://mooooooooo, de hecho, es un Uri válido. Por lo tanto, no puede verificarlo Uri.IsWellFormedUriStringdespués de insertar "http: //" y si lo verifica antes, cualquier cosa que no tenga un Schemeserá rechazado. Tal vez lo que se puede hacer es verificar en su s.Contains('.')lugar.
Ahmed Abdelhameed
moooooo por sí solo no parece una url ya que no tiene protocolo. Lo que hice fue sacar tu llamada de coincidencia de expresiones regulares, y también la edité con IsWellFormedUriString.
Epirocks
@Epirocks ¡Exactamente! El problema es que si usa IsWellFormedUriStringantes de agregar el http://, terminará rechazando cosas como, google.comy si lo usa después de agregar el http://, seguirá siendo cierto para http://mooooooooo. Es por eso que sugerí verificar si la cadena contiene un .en su lugar.
Ahmed Abdelhameed
eso está bien para mí de todos modos, no quiero aceptar una URL sin http o https. Así que uso IsWellFormedUriString primero, luego uso su función sin expresiones regulares. bool bResult = (Uri.IsWellFormedUriString (s, UriKind.Absolute) && ValidHttpURL (s, fuera uriResult)); Gracias
Epirocks
5

Después de Uri.TryCreateque puede verificar Uri.Schemesi HTTP (s).

Variable miserable
fuente
3

Trata eso:

bool IsValidURL(string URL)
{
    string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
    Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
    return Rgx.IsMatch(URL);
}

Aceptará URL así:

  • http (s): //www.example.com
  • http (s): //stackoverflow.example.com
  • http (s): //www.example.com/page
  • http (s): //www.example.com/page? id = 1 & product = 2
  • http (s): //www.example.com/page#start
  • http (s): //www.example.com: 8080
  • http (s): //127.0.0.1
  • 127.0.0.1
  • www.ejemplo.com
  • ejemplo.com
Marco Concas
fuente
2

Esto devolvería bool:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
usuario3760031
fuente
2
Creo que el OP mencionado específicamente, no le gusta Uri.IsWellFormedUriString, ya que es cierto para las rutas de archivos. ¿Tienes una solución para este problema?
Isantipov
1
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

Aquí urlestá la cadena que tienes que probar.

Eranda
fuente
3
null == la comprobación de URL es horriblemente redundante
JSON
0
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)
Ifeanyi Chukwu
fuente
Su respuesta vino en publicaciones de menor calidad. Proporcione alguna explicación a pesar de que su código se explica por sí mismo.
Harsha Biyani