最佳 URL 验证
best URL validation
我正在使用下面的代码来检查 URL 验证:
public static bool CheckURLValid(string strURL)
{
Uri uriResult;
return Uri.TryCreate(strURL, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
}
下面的结果应该显示为 true,但不知何故它有自己的模式来验证 url:
假: google.com
真: https://whosebug.com/questions/ask
我正在使用 C#,如何增强此检查 url 验证以使其更准确?
你可以试试
var isUrl = Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute);
它 returns true 你在问题中写的所有四个字符串。
您的支票URL有效return与您指定的完全一致。
到 return 所有 4 URL 都是正确的,这里是问题
错误:google.com
这是亲戚 url 并且您已指定 UriKind.Absolute 这意味着这是错误的。
这是一个 httpS(安全)url,您的方法说
&& uriResult.Scheme == Uri.UriSchemeHttp;
这将限制您只能访问 http 地址(非安全)
要获得您想要的结果,您需要使用以下方法:
public static bool CheckURLValid(string strURL)
{
Uri uriResult;
return Uri.TryCreate(strURL, UriKind.RelativeOrAbsolute, out uriResult);
}
另一种方法是只使用
Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute);
而不是重新实现所有现成的功能。如果你想用自己的 CheckUrlValid 包装它,我会使用以下内容:
public static bool CheckURLValid(string strURL)
{
return Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute); ;
}
主要问题是大多数字符串都是有效的相对 URL,所以我会避免使用 UriKind.RelativeOrAbsolute,因为 google.com 是无效的 url。大多数 Web 浏览器会自动将 HTTP:// 添加到字符串中,使其成为有效的 url。 HTTP://google.com
是有效的 url.
这是不使用 Regex 的最佳解决方案:
(请注意,例如仅使用 "IsWellFormedUriString" 将 return 对“//”为真)
public static bool IsValidUrl(string url)
{
if (url == null)
{
return false;
}
try
{
Uri uriResult = new Uri(url);
return Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute);
}
catch
{
return false;
}
}
对于单元测试,您可以检查 link 我的函数在其中获得了不错的结果。
我通过编写一个使用 Regex 来验证 url.
的小辅助方法来让它工作
以下URL的传球:
google.com
www.google.com
它失败于:
www.google.com/a 白色路径错误 space/
下面是我创建的辅助方法:
public static bool ValidateUrl(string value, bool required, int minLength, int maxLength)
{
value = value.Trim();
if (required == false && value == "") return true;
if (required && value == "") return false;
Regex pattern = new Regex(@"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!$&'\(\)\*\+,;=.]+$");
Match match = pattern.Match(value);
if (match.Success == false) return false;
return true;
}
这允许用户输入任何有效的 url,此外它还可以解释带有白色 space 的错误 url 路径,这正是我所需要的。我希望这对某人有所帮助
不确定我是否遗漏了什么,只是为了让其他人不要在 Uri.IsWellFormedUriString
上浪费时间,请注意以下测试失败:
[TestMethod]
public void TestURLValidation()
{
bool result = Uri.IsWellFormedUriString("bad", UriKind.RelativeOrAbsolute);
Assert.IsFalse(result);
}
也就是说,规定的答案会将“错误”视为有效地址。我相信这不是大多数用户所追求的行为。
我正在使用下面的代码来检查 URL 验证:
public static bool CheckURLValid(string strURL)
{
Uri uriResult;
return Uri.TryCreate(strURL, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
}
下面的结果应该显示为 true,但不知何故它有自己的模式来验证 url:
假: google.com
真: https://whosebug.com/questions/ask
我正在使用 C#,如何增强此检查 url 验证以使其更准确?
你可以试试
var isUrl = Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute);
它 returns true 你在问题中写的所有四个字符串。
您的支票URL有效return与您指定的完全一致。
到 return 所有 4 URL 都是正确的,这里是问题
错误:google.com
这是亲戚 url 并且您已指定 UriKind.Absolute 这意味着这是错误的。
这是一个 httpS(安全)url,您的方法说
&& uriResult.Scheme == Uri.UriSchemeHttp;
这将限制您只能访问 http 地址(非安全)
要获得您想要的结果,您需要使用以下方法:
public static bool CheckURLValid(string strURL)
{
Uri uriResult;
return Uri.TryCreate(strURL, UriKind.RelativeOrAbsolute, out uriResult);
}
另一种方法是只使用
Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute);
而不是重新实现所有现成的功能。如果你想用自己的 CheckUrlValid 包装它,我会使用以下内容:
public static bool CheckURLValid(string strURL)
{
return Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute); ;
}
主要问题是大多数字符串都是有效的相对 URL,所以我会避免使用 UriKind.RelativeOrAbsolute,因为 google.com 是无效的 url。大多数 Web 浏览器会自动将 HTTP:// 添加到字符串中,使其成为有效的 url。 HTTP://google.com
是有效的 url.
这是不使用 Regex 的最佳解决方案:
(请注意,例如仅使用 "IsWellFormedUriString" 将 return 对“//”为真)
public static bool IsValidUrl(string url)
{
if (url == null)
{
return false;
}
try
{
Uri uriResult = new Uri(url);
return Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute);
}
catch
{
return false;
}
}
对于单元测试,您可以检查 link 我的函数在其中获得了不错的结果。
我通过编写一个使用 Regex 来验证 url.
的小辅助方法来让它工作以下URL的传球:
google.com
www.google.com
它失败于:
www.google.com/a 白色路径错误 space/
下面是我创建的辅助方法:
public static bool ValidateUrl(string value, bool required, int minLength, int maxLength)
{
value = value.Trim();
if (required == false && value == "") return true;
if (required && value == "") return false;
Regex pattern = new Regex(@"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!$&'\(\)\*\+,;=.]+$");
Match match = pattern.Match(value);
if (match.Success == false) return false;
return true;
}
这允许用户输入任何有效的 url,此外它还可以解释带有白色 space 的错误 url 路径,这正是我所需要的。我希望这对某人有所帮助
不确定我是否遗漏了什么,只是为了让其他人不要在 Uri.IsWellFormedUriString
上浪费时间,请注意以下测试失败:
[TestMethod]
public void TestURLValidation()
{
bool result = Uri.IsWellFormedUriString("bad", UriKind.RelativeOrAbsolute);
Assert.IsFalse(result);
}
也就是说,规定的答案会将“错误”视为有效地址。我相信这不是大多数用户所追求的行为。