Ada Uri.IsWellFormedUriStringdan Uri.TryCreatemetode, tetapi mereka tampaknya kembali trueuntuk jalur file dll.
Bagaimana cara saya memeriksa apakah suatu string adalah URL HTTP yang valid (tidak harus aktif) untuk keperluan validasi input?
Ada Uri.IsWellFormedUriStringdan Uri.TryCreatemetode, tetapi mereka tampaknya kembali trueuntuk jalur file dll.
Bagaimana cara saya memeriksa apakah suatu string adalah URL HTTP yang valid (tidak harus aktif) untuk keperluan validasi input?
Jawaban:
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);
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
Metode ini berfungsi baik di http dan https. Hanya satu baris :)
if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))
MSDN: IsWellFormedUriString
file://atau ldap://. Solusi ini harus digabungkan dengan cek terhadap skema - misalnyaif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
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
}
Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
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
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.
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 ..
Setelah Uri.TryCreateAnda dapat memeriksa Uri.Schemeuntuk melihat apakah itu HTTP.
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:
Ini akan mengembalikan bool:
Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)