Cum să verificați dacă un șir de caractere este un URL HTTP valid? (Programare, C#,.Net, Validare, Url, Uri)

Louis Rhys a intrebat.

Există Uri.IsWellFormedUriString și Uri.TryCreate dar acestea par să returneze true pentru căile de acces la fișiere etc.

Cum pot verifica dacă un șir de caractere este un URL HTTP valid (nu neapărat activ) în scopul validării intrărilor?

Comentarii

  • Nu folosiți deloc regex.IsMatch pentru a valida Url. Poate ucide cpu. stackoverflow.com/questions/3122778585/… – –  > Por inesmar.
9 răspunsuri
Arabela Pâslaru

Încercați acest lucru pentru a valida URL-urile HTTP (uriName este URI-ul pe care doriți să îl testați):

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

Sau, dacă doriți să acceptați ca valide atât URL-uri HTTP cât și HTTPS (conform comentariului lui J0e3gan):

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

Comentarii

  • Ar trebui să se citească uriResult.Scheme în loc de uriName.Scheme? Folosesc supraîncărcarea pentru TryCreate care primește String în loc de Uri ca prim parametru. – user1017882
  • Este posibil să doriți să adăugați mai multe condiții la uriResult.Scheme == … În special https. Depinde pentru ce ai nevoie de acest lucru, dar această mică modificare a fost tot ce am avut nevoie pentru ca acesta să funcționeze perfect pentru mine. –  > Por Fiarr.
  • Pentru a fi clar, conform comentariului lui @Fiarr, „mica modificare” necesară pentru a ține cont de HTTPS în plus față de URL-urile HTTP este: bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps; –  > Por J0e3gan.
  • în acest mod nu reușește pentru URL-uri precum abcde. Se spune că acesta este un URL valid. –  > Por Kailash P.
  • Se pare că această tehnică nu reușește 22 din 75 de teste dotnetfiddle.net/XduN3A –  > Por whitneyland.
Kishath

Această metodă funcționează bine atât în http cât și în https. Doar o singură linie 🙂

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

MSDN: IsWellFormedUriString

Comentarii

    15

  • Această metodă va returna true pentru URI-urile non-HTTP (de ex. orice altă schemă cum ar fi file:// sau ldap://. Această soluție ar trebui să fie cuplată cu o verificare a schemei – de ex. if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ... –  > Por Ghirighiul.
  • Este aceasta conformă cu RFC3986? –  > Por Marcus.
  • @Squiggle Asta este exact ceea ce vreau să verifice, totul din moment ce fac un Downloader. Deci, acest răspuns este cea mai bună metodă pentru mine. –  > Por Beyondo.
  • Problema este că IsWellFormedUriString redă spațiile de la sfârșit ca parte validă a unui URL. Și nu, nu crede că sunt %20s, deoarece adăugarea unui simbol valid după spații duce la un URL invalid: „a” – valid „a ” – valid ?! „a a” – invalid ?!? –  > Por Ivan Caravanio.
Erçin Dedeoğlu
    public static bool CheckURLValid(this string source)
    {
        Uri uriResult;
        return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
    }

Utilizare:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

UPDATE: (o singură linie de cod) Mulțumiri @GoClimbColorado

public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;

Utilizare:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

Comentarii

  • Acest lucru nu pare să se ocupe de urile www. IE: www.google.com este afișat ca fiind invalid. –  > Por Zauber Paracelsus.
  • @ZauberParacelsus „www.google.com” este invalid. URL-ul ar trebui să înceapă cu „http”, „ftp”, „file” etc. Șirul ar trebui să fie „http:// www.google.com” fără spațiu –  > Por Erçin Dedeoğlu.
  • Astăzi, parametrul out poate aduce o îmbunătățire Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps –  > Por GoClimbColorado.
  • acest lucru nu funcționează pentru șiruri aleatorii cum ar fi abc,tassdds etc.. –  > Por lazydeveloper.
41686d6564

Toate răspunsurile de aici fie permit URL-uri cu alte scheme (de ex, file://, ftp://) sau resping URL-urile lizibile de către om care nu încep cu http:// sau https:// (de ex, www.google.com) ceea ce nu este bine atunci când se lucrează cu intrările utilizatorului.

Iată cum procedez eu:

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

Utilizare:

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

Ieșire:

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False

Comentarii

  • Acest lucru lasă să treacă cuvinte simple, cum ar fi „mooooooooo”, dar folosit împreună cu Uri.IsWellFormedUriString ar putea fi bun –  > Por Epirocks.
  • @Epirocks Acesta este un punct de vedere bun. Problema este că http://mooooooooo este, de fapt, un Uri valid. Prin urmare, nu puteți verifica dacă Uri.IsWellFormedUriString după inserarea „http://”, iar dacă îl verificați înainte, orice lucru care nu are un Scheme va fi respins. Poate că ceea ce se poate face este să verificăm pentru s.Contains('.') în schimb. –  > Por 41686d6564.
  • moooooo de unul singur nu pare a fi o adresă URL, deoarece nu are niciun protocol pe el. Ceea ce am făcut a fost să scot apelul de potrivire regex, și &&’ed cu IsWellFormedUriString, de asemenea. –  > Por Epirocks.
  • @Epirocks Exact! Problema este că, dacă folosiți IsWellFormedUriString înainte de a adăuga apelul http://, veți ajunge să respingeți lucruri precum google.com iar dacă îl folosești după ce ai adăugat http://, tot va returna true pentru http://mooooooooo. De aceea am sugerat să verificați dacă șirul conține un . în loc de aceasta. –  > Por 41686d6564.
  • pentru mine e bine oricum, nu vreau să accept un url fără http sau https pe el. Așa că folosesc mai întâi IsWellFormedUriString, apoi folosesc funcția ta fără regex. bool bResult = (Uri.IsWellFormedUriString(s, UriKind.Absolute) && ValidHttpURL(s, out uriResult)); Mulțumesc –  > Por Epirocks.
Marco Concas

Încearcă asta:

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

Va accepta URL-uri ca acesta:

  • 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.0.1
  • 127.0.0.1
  • www.example.com
  • exemplu.com

Variabila mizerabilă

După Uri.TryCreate puteți verifica Uri.Scheme pentru a vedea dacă este HTTP(s).

user3760031

Acest lucru ar returna bool:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)

Comentarii

  • Cred că OP a menționat în mod specific că nu-i place Uri.IsWellFormedUriString, deoarece oferă true pentru căile de acces la fișiere. Aveți o soluție pentru această problemă? –  > Por Isantipov.
Eranda
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

Aici url este șirul pe care trebuie să-l testați.

Comentarii

  • verificarea null == url este îngrozitor de redundantă –  > Por JSON.
Ifeanyi Chukwu
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)

Comentarii

  • Răspunsul dvs. a venit în posturi de calitate inferioară. Vă rugăm să oferiți o explicație, chiar dacă codul dvs. este autoexplicativ. –  > Por Harsha Biyani.