Orada Uri.IsWellFormedUriString
ve Uri.TryCreate
yöntemleri, ancak dönmek gibi görünüyortrue
dosya yolları vb
Bir dizenin giriş doğrulama amacıyla geçerli (zorunlu olarak etkin olmayan) bir HTTP URL olup olmadığını nasıl kontrol edebilirim?
Orada Uri.IsWellFormedUriString
ve Uri.TryCreate
yöntemleri, ancak dönmek gibi görünüyortrue
dosya yolları vb
Bir dizenin giriş doğrulama amacıyla geçerli (zorunlu olarak etkin olmayan) bir HTTP URL olup olmadığını nasıl kontrol edebilirim?
Yanıtlar:
HTTP URL'lerini doğrulamak için bunu deneyin ( uriName
test etmek istediğiniz URI'dır):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp;
Veya hem HTTP hem de HTTPS URL'lerini geçerli olarak kabul etmek istiyorsanız (J0e3gan'ın yorumu uyarınca):
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;
Bu yöntem hem http hem de https'de sorunsuz çalışır. Sadece bir satır :)
if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))
MSDN: IsWellFormedUriString
file://
ya da ldap://
bu çözelti Şema karşı bir kontrol ile birlikte olmalıdır - örn.if (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;
}
Kullanımı:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
GÜNCELLEME: (tek satır kod) Teşekkürler @GoClimbColorado
public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;
Kullanımı:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
Buradaki tüm yanıtlar, diğer şemalara sahip URL'lere izin verir (ör. file://
, ftp://
) Veya başlamamış http://
veya okunamayan URL'leri reddeder https://
(ör.www.google.com
) kullanıcı girişlerine uğraşırken değil iyidir .
İşte nasıl yaparım:
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;
}
Kullanımı:
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);
}
Çıktı:
True https://www.google.com/
True http://www.google.com/
True http://www.google.com/
True http://google.com/
False
http://mooooooooo
, aslında, geçerli bir Uri. Bu nedenle, Uri.IsWellFormedUriString
"http: //" ekledikten sonra kontrol edemezsiniz ve daha önce kontrol ederseniz, olmayan bir şey Scheme
reddedilir. Belki s.Contains('.')
bunun yerine ne yapılabileceğini kontrol edebiliriz .
IsWellFormedUriString
eklemeden önce kullanırsanız, bunun http://
gibi şeyleri reddedersiniz google.com
ve ekledikten sonra kullanırsanız http://
, yine de true değerine dönecektir http://mooooooooo
. Bu yüzden dize .
yerine bir tane içerip içermediğini kontrol etmeyi önerdim .
Sonra HTTP (ler) olup olmadığını Uri.TryCreate
kontrol edebilirsiniz Uri.Scheme
.
Bunu dene:
bool IsValidURL(string URL)
{
string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return Rgx.IsMatch(URL);
}
URL şu şekilde kabul edilecektir:
Bu bool döndürür:
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)