我需要一个Uri验证方法。所以,字符串如:
“http://www.google.com”, “www.google.com”, “google.com”
..必须验证为Uri。而且像“google”这样的普通字符串也不能被验证为Uri。 要进行此检查,我使用两种方法:UriBuilder和Uri.TryCreate()。
UriBuilder的问题在于我给它的任何字符串,它返回一个Uri。当我在其构造函数中传递一个普通字符串时,它给它一个方案并返回“http://google/”,这不是我想要的行为。
Uri.TryCreate()的问题在于,虽然它可以与“http://www.google.com”和“www.google.com”一起使用,但当我给它“google.com”时,它不会验证为乌里。
我考虑过对字符串进行检查,如果它以http://或www开头,将字符串发送到UriBuilder类,但这对“google.com”也没有帮助,“google.com”也必须是Uri。< / p>
如何将“google.com”等内容验证为Uri,而不是“google”?检查.com,.net,.org字符串的结尾似乎不灵活。
答案 0 :(得分:17)
您正在寻找的是Uri.IsWellFormedUriString
。以下代码返回true:
Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute)
如果将UriKind设置为Absolute,则返回false:
Uri.IsWellFormedUriString("google.com", UriKind.Absolute)
编辑: 有关UriKind枚举的信息,请参阅here。
绝对URI的特点是对资源的完整引用(例如:http://www.contoso.com/index.html),而相对Uri依赖于先前定义的基URI(例如:/index.html)。
另请参阅Uri.IsWellFormedUriString
Uri.IsWellFormedUriString
。此方法符合RFC 2396和RFC 2732。
如果查看here,您会发现google.com不是有效的URI。事实上,www.google.com并非如此。但在 F下。缩写网址,此详细说明如下:
URL语法旨在明确引用网络 通过URL方案的资源和可扩展性。但是,作为URL 识别和使用已成为司空见惯的传统媒体 (电视,广播,报纸,广告牌等)越来越多 使用缩写的URL引用。即,由...组成的参考 只有所识别资源的权限和路径部分,例如 如 www.w3.org/Addressing/ 或者只是DNS主机名。这些参考文献主要是 用于人类解释而非机器,用于 假设基于上下文的启发式方法足以完成 URL(例如,以“www”开头的大多数主机名可能具有 URL前缀“http://”)。虽然没有标准的一套 用于消除缩写URL引用歧义的启发式方法,许多客户端 实现允许用户输入它们 启发式地解决了。应该注意的是,这种启发式可能 随着时间的推移而变化,特别是在引入新的URL方案时。 由于缩写的URL与相对URL路径具有相同的语法, 缩写的URL引用不能用于相对的上下文中 URL是预期的。这限制了缩写URL到场所的使用 没有定义基本URL的地方,例如对话框和离线 广告。
我从中理解的是,{{1}}接受www.abc.com形式的字符串作为有效的URI。但是google.com不被接受为绝对URI,而是被接受为相对URI,因为它符合相对路径规范(路径可以包含。)。
另外,作为旁注,如果要使用正则表达式来解析URI,可以阅读 B.使用正则表达式解析URI引用。
答案 1 :(得分:5)
public static bool IsValidUri(string uriString)
{
Uri uri;
if (!uriString.Contains("://")) uriString = "http://" + uriString;
if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out uri))
{
if (Dns.GetHostAddresses(uri.DnsSafeHost).Length > 0)
{
return true;
}
}
return false;
}
答案 2 :(得分:3)
这是来自Jojaba的代码的变体,我感谢DNS检查器,这就是我需要的。唯一的问题是它在我的逻辑中使用try catch,我希望避免。
public static Uri StringToAbsoluteUri(string uriString)
{
Uri resultUri = null;
if (!uriString.Contains(Uri.SchemeDelimiter))
uriString = Uri.UriSchemeHttp + Uri.SchemeDelimiter + uriString;
if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out resultUri))
{
try
{
IPAddress[] addressesOfHost = Dns.GetHostAddresses(resultUri.DnsSafeHost);
if (addressesOfHost.Length > 0)
{
return resultUri;
}
}
catch (System.Net.Sockets.SocketException)
{
return null;
}
}
return resultUri;
}
答案 3 :(得分:2)
使用RegExp。
验证网址的示例代码
Regex RgxUrl = new Regex("(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?");
if (RgxUrl.IsMatch(<yourURLparameter>))
{
//url is valid
}
else
{
//url is not valid
}