Есть в Uri.IsWellFormedUriString
и Uri.TryCreate
методы, но они , кажется , чтобы вернуться true
на пути к файлам и т.д.
Как проверить, является ли строка действительным (не обязательно активным) HTTP-URL для проверки входных данных?
Есть в Uri.IsWellFormedUriString
и Uri.TryCreate
методы, но они , кажется , чтобы вернуться true
на пути к файлам и т.д.
Как проверить, является ли строка действительным (не обязательно активным) HTTP-URL для проверки входных данных?
Ответы:
Попробуйте это проверить HTTP-URL ( uriName
это URI, который вы хотите проверить):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp;
Или, если вы хотите принять действительные URL-адреса HTTP и HTTPS (согласно комментарию 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. Таким образом, вы не можете проверить Uri.IsWellFormedUriString
после вставки «http: //», и если вы проверяете его раньше, все, что не имеет, Scheme
будет отклонено. Может быть, то, что можно сделать, это проверить s.Contains('.')
вместо этого.
IsWellFormedUriString
перед добавлением http://
, вы в конечном итоге отвергаете такие вещи, как, google.com
и если вы используете его после добавления http://
, он все равно будет возвращать true для http://mooooooooo
. Вот почему я предложил проверить, содержит ли строка .
вместо этого.
После Uri.TryCreate
вы можете проверить, Uri.Scheme
если это HTTP (s).
Попробуй это:
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)