.net 从字符串验证Uri
我需要一个Uri验证方法。因此,字符串如下: “, “www.google.com”, “google.com” …必须验证为Uri。而且像“google”这样的普通字符串也不能被验证为Uri。 要执行此检查,我使用两个方法:UriBuilder和Uri.TryCreate() UriBuilder的问题是,我给它的任何字符串都会返回一个Uri。当我在其构造函数中传递一个普通字符串时,它会给它一个scheme并返回“”这不是我想要的行为 Uri.TryCreate()的问题是,虽然它可以与“”和“www.google.com”一起工作,但当我给它“google.com”时,它不会验证它是否为Uri 我考虑过对字符串进行检查,如果它以http://或www开头,则将字符串发送到UriBuilder类,但这对“google.com”没有帮助,因为“google.com”也必须是Uri.net 从字符串验证Uri,.net,validation,uri,.net,Validation,Uri,我需要一个Uri验证方法。因此,字符串如下: “, “www.google.com”, “google.com” …必须验证为Uri。而且像“google”这样的普通字符串也不能被验证为Uri。 要执行此检查,我使用两个方法:UriBuilder和Uri.TryCreate() UriBuilder的问题是,我给它的任何字符串都会返回一个Uri。当我在其构造函数中传递一个普通字符串时,它会给它一个scheme并返回“”这不是我想要的行为 Uri.TryCreate()的问题是,虽然它可以与“”和
我如何验证像“google.com”这样的东西作为Uri,而不是“google”?检查.com、.net、.org的字符串结尾似乎不太灵活。您要查找的是
Uri.iswellFormedUrString
。以下代码返回true:
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;
}
Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute)
如果将UriKind设置为绝对值,则返回false:
Uri.IsWellFormedUriString("google.com", UriKind.Absolute)
编辑:
有关UriKind枚举,请参阅
- RelativeOrAbsolute:Uri的类型是不确定的李>
- 绝对:Uri是绝对Uri李>
- 相对:Uri是相对Uri
Uri.iswellFormedUrString
。该方法符合RFC 2396和RFC 2732的规定
如果你看一下,你会发现google.com不是一个有效的URI。事实上,www.google.com两者都不是。但是在F.缩写URL下,这种情况详细解释如下:
URL语法是为明确地引用网络而设计的
资源和通过URL方案的可扩展性。但是,作为URL
识别和使用已成为常见的传统媒体
(电视、广播、报纸、广告牌等)越来越多
使用缩写URL引用。也就是说,引用由
只有已识别资源的权限和路径部分,例如
作为
www.w3.org/Addressing/
或者仅仅是DNS主机名本身。这些参考资料主要是
用于人工解释而非机器,具有
假设基于上下文的启发式算法足以完成
URL(例如,大多数以“www”开头的主机名可能有
URL前缀为“http://”)。虽然没有一套标准的
用于消除缩写URL引用歧义的启发式方法,许多客户端
实现允许用户和用户输入它们
启发式解决。应该注意的是,这种启发式可能会
随着时间的推移而改变,特别是在引入新的URL方案时。
由于缩写URL的语法与相对URL路径相同,
缩写URL引用不能用于相对
需要URL。这将缩写URL的使用限制在位置
没有定义的基本URL,例如对话框和脱机
广告
我从中了解到,Uri.IsWellFormedUriString
接受www.abc.com格式的字符串作为有效的Uri。但是google.com不被接受为绝对URI,而被接受为相对URI,因为它符合相对路径规范(路径可以包含)
另外,作为旁注,如果您想使用正则表达式解析URI,可以阅读B。使用正则表达式解析URI引用为此使用RegExp
验证URL的示例代码
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
}
Regex-RgxUrl=newregex((([a-zA-Z][0-9a-zA-Z+\-\\\\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\.\-\\\.\\\-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
if(RgxUrl.IsMatch())
{
//url是有效的
}
其他的
{
//url无效
}
这是Jojaba的代码变体,我感谢他提供了DNS检查程序,这正是我所需要的。唯一的问题是,它在逻辑上使用了我希望避免的尝试捕捉
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;
}
协议可以不是HTTP。@slugster:这就是为什么他检查它是否已经有协议。。。他只会在没有的情况下将其设置为http。。这是到目前为止最常见的,默认设置是非常安全的。谢谢你的代码。然而,这段代码从一个单词构建了一个Uri——如果我通过“google”,我得到的是“return”,这不是我所需要的。另外,我希望避免在try/catch结构上构建代码逻辑。@andrei:听起来您需要Uri验证程序和DNS检查程序。我更新了函数以包含这两个函数,并删除了try/catch。感谢您提供更新的代码。顺便说一句,您可以将字符串“//”和“http”替换为它们的对象对应物Uri.SchemeDelimiter和Uri.UriSchemeHttp。这段代码的问题是,当字符串像“google”一样正常时,它抛出一个SocketException。因此,我对处理它的代码做了一个修改:您能验证您是想要验证URL还是URI吗?你的问题有点让人困惑。@Slugster-在阅读了你的问题后,我在网上查看了一下,以了解其中的区别,所以答案是我需要验证一个URI,而不是URL。谢谢你的回答。这个方法很有趣,它确实验证了“google.com”,这很好,但是它也验证了一个单词(“google”)是一个格式良好的uri,我不需要它。有益的回答nonetheless@Andrei:我已经更新了我的答案。答案在RFC2396中。谢谢你,我已经进一步阅读了关于Uri.IsWellFormedUriString的内容,我想我理解了为什么它会将“google”验证为有效的Uri。所以,我想我需要的是一种检查字符串末尾是否有