Ada Uri.IsWellFormedUriString
dan Uri.TryCreate
metode, tetapi mereka tampaknya kembali true
untuk jalur file dll.
Bagaimana cara saya memeriksa apakah suatu string adalah URL HTTP yang valid (tidak harus aktif) untuk keperluan validasi input?
Ada Uri.IsWellFormedUriString
dan Uri.TryCreate
metode, tetapi mereka tampaknya kembali true
untuk 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 ( uriName
adalah 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.IsWellFormedUriString
setelah memasukkan "http: //" dan jika Anda memeriksanya sebelumnya, apa pun yang tidak memiliki Scheme
akan ditolak. Mungkin yang bisa dilakukan adalah kita periksa s.Contains('.')
saja.
IsWellFormedUriString
sebelum menambahkan http://
, Anda akan akhirnya menolak hal-hal seperti google.com
dan 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.TryCreate
Anda dapat memeriksa Uri.Scheme
untuk 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)