Como verificar se uma string é uma URL HTTP válida?

Respostas:

452

Tente isso para validar URLs HTTP ( uriNameé o URI que você deseja testar):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && uriResult.Scheme == Uri.UriSchemeHttp;

Ou, se você deseja aceitar os URLs HTTP e HTTPS como válidos (pelo comentário de J0e3gan):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
Arabela Paslaru
fonte
6
Deve ler uriResult.Scheme em vez de uriName.Scheme? Estou usando a sobrecarga para TryCreate que leva String em vez de Uri como seu primeiro parâmetro.
7
Convém adicionar mais condições ao uriResult.Scheme == ... Especificamente https. Depende do que você precisa disso, mas essa pequena alteração foi tudo que eu precisava para que funcionasse perfeitamente para mim.
Fiarr
11
Para ser per clara @ comentário de Fiarr, a "pequena mudança" necessária para conta para HTTPS, além de HTTP URLs é:bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
J0e3gan
3
dessa forma, falha em URLs como o abcde . Diz que este é um URL válido.
precisa
7
Parece que esta técnica falhou 22 de 75 testes dotnetfiddle.net/XduN3A #
whitneyland 21/10
98

Este método funciona bem em http e https. Apenas uma linha :)

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

MSDN: IsWellFormedUriString

Kishath
fonte
13
Isto irá voltar verdadeiro para não-URIs HTTP (ou seja qualquer outro regime tal como file://ou ldap://Esta solução deve ser acoplado com um controlo contra o esquema -. Por exemploif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
Linha ondulada
Isso é compatível com RFC3986?
Marcus
3
@ Squiggle Isso é exatamente o que eu quero verificar, tudo desde que eu estou fazendo um Downloader. Então, essa resposta é o melhor método para mim.
Beyondo 27/11/18
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
}

UPDATE: (única linha de código) Obrigado @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
fonte
Isso não parece lidar com URLs www. IE: www.google.com é mostrado como inválido.
Zauber Paracelsus
6
@ZauberParacelsus "www.google.com" é inválido. A média do URL deve começar com "http", "ftp", "file" etc. a string deve ser "http: // www.google.com" sem espaço
Erçin Dedeoğlu
1
Hoje, o parâmetro para fora pode fazer uma melhoriaUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado
11

Todas as respostas aqui também permitir que URLs com outros sistemas (por exemplo, file://, ftp://) ou rejeitar URLs legíveis que não começam com http://ou https://(por exemplo, www.google.com) que não é bom quando se lida com entradas do usuário .

Aqui está como eu faço:

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);
}

Resultado:

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False
Ahmed Abdelhameed
fonte
1
Isso permite que palavras simples como "mooooooooo", mas usadas em conjunto com Uri.IsWellFormedUriString, possam ser boas
Epirocks 18/19
@ Eppirocks Esse é um bom ponto. O problema é que http://moooooooooé, de fato, um Uri válido. Portanto, você não pode procurar Uri.IsWellFormedUriStringdepois de inserir "http: //" e, se já tiver verificado antes, tudo o que não tiver um Schemeserá rejeitado. Talvez o que se possa fazer seja procurarmos s.Contains('.').
Ahmed Abdelhameed
O moooooo por si só não se parece com um URL, pois não possui protocolo. O que fiz foi atender a sua chamada de correspondência regex e também a utilizamos com IsWellFormedUriString.
Epirocks
@Epirocks Exactly! O problema é que, se você usar IsWellFormedUriStringantes de adicionar o http://, acabará rejeitando coisas como google.come se você usá-lo após adicionar o http://, ele ainda retornará verdadeiro para http://mooooooooo. É por isso que sugeri verificar se a string contém um ..
Ahmed Abdelhameed
isso é bom para mim de qualquer maneira. Não quero aceitar um URL sem http ou https. Então, eu uso IsWellFormedUriString primeiro, depois uso sua função sem regex. bool bResult = (Uri.IsWellFormedUriString (s, UriKind.Absolute) && ValidHttpURL (s, sai uriResult)); Obrigado
Epirocks
5

Depois Uri.TryCreatevocê pode verificar Uri.Schemepara ver se HTTP (s).

Variável miserável
fonte
3

Tente isso:

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

Ele aceitará URL assim:

  • 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.example.com
  • example.com
Marco Concas
fonte
2

Isso retornaria bool:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
user3760031
fonte
2
Eu acho que o OP mencionado especificamente, ele não gosta de Uri.IsWellFormedUriString, pois dá verdade para caminhos de arquivo. Você tem uma solução para este problema?
Isantipov
1
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

Aqui urlestá a string que você deve testar.

Eranda
fonte
3
== null url verificação é terrivelmente reduntant
JSON
0
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)
Ifeanyi Chukwu
fonte
Sua resposta veio em postagens de qualidade inferior. Forneça algumas explicações, mesmo que seu código seja auto-explicativo.
Harsha Biyani