Bagaimana cara memeriksa apakah suatu string adalah URL HTTP yang valid?

Jawaban:

452

Coba ini untuk memvalidasi URL HTTP ( uriNameadalah URI yang ingin Anda uji):

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

Atau, jika Anda ingin menerima URL HTTP dan HTTPS sebagai valid (sesuai komentar J0e3gan):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
Arabela Paslaru
sumber
6
Haruskah ini membaca uriResult.Scheme alih-alih uriName.Scheme? Saya menggunakan overload ke TryCreate yang mengambil String alih-alih Uri sebagai parameter pertama.
7
Anda mungkin ingin menambahkan lebih banyak kondisi ke uriResult.Scheme == ... Khususnya https. Tergantung pada apa yang Anda butuhkan ini, tetapi perubahan kecil ini yang saya butuhkan untuk bekerja dengan sempurna bagi saya.
Fiarr
11
Agar lebih jelas per komentar Fiarr, "perubahan kecil" yang diperlukan untuk memperhitungkan HTTPS selain URL HTTP adalah:bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
J0e3gan
3
cara ini gagal untuk URL seperti abcde . Dikatakan ini adalah URL yang valid.
Kailash P
7
Sepertinya teknik ini gagal 22 dari 75 tes dotnetfiddle.net/XduN3A
whitneyland
98

Metode ini berfungsi baik di http dan https. Hanya satu baris :)

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

MSDN: IsWellFormedUriString

Kishath
sumber
13
Ini akan mengembalikan true untuk URI non-HTTP (yaitu skema lain seperti file://atau ldap://. Solusi ini harus digabungkan dengan cek terhadap skema - misalnyaif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
Squiggle
Apakah RFC3986 ini sesuai?
Marcus
3
@Segiggle Itulah yang ingin saya periksa, semuanya karena saya membuat Downloader. Jadi, jawaban ini adalah metode terbaik untuk saya.
Beyondo
24
    public static bool CheckURLValid(this string source)
    {
        Uri uriResult;
        return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
    }

Pemakaian:

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

UPDATE: (satu baris kode) Terima kasih @GoClimbColorado

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

Pemakaian:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}
Erçin Dedeoğlu
sumber
Tampaknya ini tidak menangani url www. IE: www.google.com ditunjukkan tidak valid.
Zauber Paracelsus
6
@ZauberParacelsus "www.google.com" tidak valid. Maksud URL harus dimulai dengan "http", "ftp", "file" dll. String harus "http: // www.google.com" tanpa spasi
Erçin Dedeoğlu
1
Hari ini, parameter keluar dapat membuat peningkatanUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado
11

Semua jawaban di sini baik memungkinkan URL dengan skema lain (misalnya, file://, ftp://) atau menolak URL terbaca-manusia yang tidak dimulai dengan http://atau https://(misalnya, www.google.com) yang tidak baik ketika berhadapan dengan input pengguna .

Begini cara saya melakukannya:

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

Pemakaian:

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

Keluaran:

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False
Ahmed Abdelhameed
sumber
1
Hal ini memungkinkan melalui kata-kata tunggal seperti "mooooooooo" tapi digunakan dalam hubungannya dengan Uri.IsWellFormedUriString bisa baik
Epirocks
@Epirocks Itu poin bagus. Masalahnya adalah http://mooooooooo, pada kenyataannya, Uri yang valid. Karenanya, Anda tidak dapat memeriksa Uri.IsWellFormedUriStringsetelah memasukkan "http: //" dan jika Anda memeriksanya sebelumnya, apa pun yang tidak memiliki Schemeakan ditolak. Mungkin yang bisa dilakukan adalah kita periksa s.Contains('.')saja.
Ahmed Abdelhameed
moooooo dengan sendirinya tidak terlihat seperti url karena tidak memiliki protokol di dalamnya. Apa yang saya lakukan adalah mengambil panggilan pertandingan regex Anda, dan &&kan juga dengan IsWellFormedUriString juga.
Epirocks
@Epirocks Persis! Masalahnya adalah bahwa jika Anda menggunakan IsWellFormedUriStringsebelum menambahkan http://, Anda akan akhirnya menolak hal-hal seperti google.comdan jika Anda menggunakannya setelah menambahkan http://, itu akan tetap benar untuk http://mooooooooo. Itu sebabnya saya menyarankan untuk memeriksa apakah string tersebut berisi ..
Ahmed Abdelhameed
toh itu baik untuk saya. Saya tidak ingin menerima url tanpa http atau https. Jadi saya menggunakan IsWellFormedUriString terlebih dahulu, lalu gunakan fungsi Anda tanpa regex. bool bResult = (Uri.IsWellFormedUriString (s, UriKind.Absolute) && ValidHttpURL (s, out uriResult)); Terima kasih
Epirocks
5

Setelah Uri.TryCreateAnda dapat memeriksa Uri.Schemeuntuk melihat apakah itu HTTP.

Variabel yang menyedihkan
sumber
3

Coba itu:

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

Ini akan menerima URL seperti itu:

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

Ini akan mengembalikan bool:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
pengguna3760031
sumber
2
Saya pikir OP secara khusus disebutkan, dia tidak suka Uri.IsWellFormedUriString karena memberikan true untuk path file. Apakah Anda punya solusi untuk masalah ini?
Isantipov
1
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

Inilah urlstring yang harus Anda uji.

Eranda
sumber
3
null == url cek mengerikan reduntant
JSON
0
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)
Ifeanyi Chukwu
sumber
Jawaban Anda datang di pos berkualitas lebih rendah. Harap berikan beberapa penjelasan meskipun kode Anda cukup jelas.
Harsha Biyani