从String验证Uri

Amc*_*tty 9 .net validation uri

我需要一个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.

如何验证像"google.com"这样的东西作为Uri,而不是"google"?检查.com,.net,.org字符串的结尾似乎不灵活.

Zaf*_*fer 18

你在寻找什么Uri.IsWellFormedUriString.以下代码返回true:

Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute)
Run Code Online (Sandbox Code Playgroud)

如果将UriKind设置为Absolute,则返回false:

Uri.IsWellFormedUriString("google.com", UriKind.Absolute)
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅此处获取UriKind枚举.

  • RelativeOrAbsolute:Uri的种类是不确定的.
  • 绝对:Uri绝对是Uri.
  • 相对:Uri是一个相对的Uri.

从MSDN文档:

绝对URI的特点是对资源的完整引用(例如:http://www.contoso.com/index.html),而相对Uri依赖于先前定义的基URI(例如:/index.html).

此外,看到这里的Uri.IsWellFormedUriString.此方法符合RFC 2396和RFC 2732.

如果您查看RFC 2396,您会发现google.com不是有效的URI.事实上,www.google.com并非如此.但在F.缩写URL下,这个位置详细解释如下:

URL语法旨在通过URL方案明确引用网络资源和可扩展性.然而,随着URL识别和使用变得普遍,传统媒体(电视,广播,报纸,广告牌等)越来越多地使用缩写的URL引用.也就是说,引用仅由所标识资源的权限和路径部分组成,例如www.w3.org/Addressing/或者仅仅是DNS主机名.这样的引用主要用于人类解释而不是机器,假设基于上下文的启发式方法足以完成URL(例如,以"www"开头的大多数主机名可能具有"http://"的URL前缀. ).虽然没有标准的启发式方法来消除缩写URL引用的歧义,但许多客户端实现允许用户输入并启发式解析.应该注意,这种启发式方法可能会随着时间而改变,特别是在引入新的URL方案时.由于缩写的URL具有与相对URL路径相同的语法,因此缩写的URL引用不能用于需要相对URL的上下文中.这将缩写URL的使用限制在没有定义基本URL的位置,例如对话框和离线广告.应该注意,这种启发式方法可能会随着时间而改变,特别是在引入新的URL方案时.由于缩写的URL具有与相对URL路径相同的语法,因此缩写的URL引用不能用于需要相对URL的上下文中.这将缩写URL的使用限制在没有定义基本URL的位置,例如对话框和离线广告.应该注意,这种启发式方法可能会随着时间而改变,特别是在引入新的URL方案时.由于缩写的URL具有与相对URL路径相同的语法,因此缩写的URL引用不能用于需要相对URL的上下文中.这将缩写URL的使用限制在没有定义基本URL的位置,例如对话框和离线广告.

我从中理解的是,Uri.IsWellFormedUriString接受www.abc.com形式的字符串作为有效的URI.但是google.com不被接受为绝对URI,而是被接受为相对URI,因为它符合相对路径规范(路径可以包含.).

另外,作为旁注,如果要使用正则表达式来解析URI,可以阅读B.使用正则表达式解析URI引用.


tid*_*all 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;
}
Run Code Online (Sandbox Code Playgroud)