Існують Uri.IsWellFormedUriString
і Uri.TryCreate
методи, але вони, схоже, повертаються true
до файлових шляхів тощо.
Як перевірити, чи рядок є дійсною (не обов'язково активною) HTTP-адресою для цілей перевірки введення?
Існують Uri.IsWellFormedUriString
і Uri.TryCreate
методи, але вони, схоже, повертаються true
до файлових шляхів тощо.
Як перевірити, чи рядок є дійсною (не обов'язково активною) HTTP-адресою для цілей перевірки введення?
Відповіді:
Спробуйте це перевірити HTTP-адреси ( uriName
це URI, який ви хочете перевірити):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp;
Або, якщо ви хочете прийняти і HTTP, і HTTPS URL як дійсні (за коментарем 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;
Цей метод добре працює як у http, так і в https. Всього один рядок :)
if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))
MSDN: IsWellFormedUriString
file://
або ldap://
. Це рішення має бути поєднане з перевіркою на схему, наприклад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;
}
Використання:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
ОНОВЛЕННЯ: (один рядок коду) Спасибі @GoClimbColorado
public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;
Використання:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
Всі відповіді тут або дозволити URL - адреса з іншими схемами (наприклад, file://
, ftp://
) або відхилити легким для читання URL , які не починаються з http://
або https://
(наприклад, www.google.com
) , які не дуже добре при роботі з вводиться користувачем .
Ось як я це роблю:
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;
}
Використання:
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);
}
Вихід:
True https://www.google.com/
True http://www.google.com/
True http://www.google.com/
True http://google.com/
False
http://mooooooooo
в тому, що насправді є дійсним Урі. Отже, ви не можете перевірити їх Uri.IsWellFormedUriString
після вставки "http: //", і якщо ви перевірите це раніше, все, що не має, Scheme
буде відхилено. Можливо, що ми можемо зробити, це ми перевіримо s.Contains('.')
замість цього.
IsWellFormedUriString
перед додаванням http://
, ви, в кінцевому підсумку, відхиляєте такі речі, як google.com
і якщо ви будете використовувати їх після додавання http://
, вона все одно поверне справжнє значення для http://mooooooooo
. Ось чому я запропонував перевірити, чи містить рядок .
замість цього.
Після Uri.TryCreate
ви можете перевірити, Uri.Scheme
чи це HTTP (и).
Спробуйте:
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:
Це поверне 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)