.net 从字符串验证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()的问题是,虽然它可以与“”和

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


我如何验证像“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的特征是对资源的完整引用(示例:),而相对Uri依赖于先前定义的基本Uri(示例:/index.html)

另外,请参见
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。所以,我想我需要的是一种检查字符串末尾是否有