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;
あるいは、HTTPとHTTPSの両方のURLを有効なものとして受け入れたい場合(J0e3ganのコメントによる):
Uri uriResult;
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
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
}
PDATE:(1行のコード)ありがとう@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
}
ここでのすべての答えは、他のスキームのURL(file://
、ftp://
など)を許可するか、http://
またはhttps://
で始まらない人間が読めるURL(例: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
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を受け入れます:
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
return false;
else
return true;
ここで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)