如何检查uri字符串是不是有效

Posted

技术标签:

【中文标题】如何检查uri字符串是不是有效【英文标题】:How to check that a uri string is valid如何检查uri字符串是否有效 【发布时间】:2011-06-17 15:24:40 【问题描述】:

如何检查 uri 字符串是否有效(可以将其提供给 Uri 构造函数)?

到目前为止,我只有以下方法,但出于显而易见的原因,我更喜欢一种不那么粗暴的方式:

    Boolean IsValidUri(String uri)
    
        try
        
            new Uri(uri);
            return true;
        
        catch
        
            return false;
        
    

我尝试了 Uri.IsWellFormedUriString,但它似乎并不喜欢你可以在构造函数中抛出的所有内容。例如:

String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: 0", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: 0", IsValidUri(test));

输出将是:

Uri.IsWellFormedUriString says: False
IsValidUri says: True

更新/回答

Uri 构造函数默认使用种类 Absolute。当我尝试使用 Uri.TryCreate 和构造函数时,这导致了差异。如果为构造函数和 TryCreate 匹配 UriKind,您确实会得到预期的结果。

【问题讨论】:

另见:Is there a URL validator on .Net? 【参考方案1】:

格式良好的 URI 意味着符合某些 RFC。您示例中的本地路径与这些不符合。在IsWellFormedUriString 文档中阅读更多信息。

该方法的错误结果并不意味着Uri 类将无法解析输入。虽然 URI 输入可能不符合 RFC,但它仍然可以是有效的 URI。

更新:为了回答您的问题 - 正如 Uri 文档所示,有一个名为 TryCreate 的静态方法将准确地尝试您想要的内容并返回 true 或 false(以及实际的 @ 987654327@ 实例如果为真)。

【讨论】:

问题是“如何检查 uri 字符串是否有效(您可以将其提供给 Uri 构造函数)?” TryCreate 并没有真正告诉您字符串是否会被构造函数接受。请参阅更新。 @Manuel:这根本没有意义 - TryCreateUri 构造函数的结果应该相同 - 尝试传递 UriKind 就像你为 TryCreate 所做的那样. 你是对的。构造函数使用默认类型 Absolute。谢谢。 根据.Net 来源the IsWellFormedUriString method contains the TryCreate method call plus extra checks,因此我更喜欢使用 IsWellFormedUriString 方法,因为此类任务更强大。【参考方案2】:

由于接受的答案没有提供明确的示例,因此这里有一些用于验证 C# 中 URI 的代码:

Uri outUri;

if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
   && (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))

    //Do something with your validated Absolute URI...

【讨论】:

不要相信 Uri.TryCreate 函数!这也将允许错误的 URL。试试这个“http://http://google.com/page”(删除空格)。这个网址通过了 TryCreate 函数,但是是错误的。 @No1Lives4Ever 你是正确的,它解析为你提到的有效,但这在技术上并没有错。英文解释:使用http协议(http://),使用显式(但省略)连接到“http”的DNS条目(http://**http**)端口 (http**:**) - 所以我将假设协议的默认值;您提供了一个空的第一级文件夹(http:**//**),但我知道您的意思;)后跟一个路径段“google.com”(http:/**google.com/**)然后是资源“页面”(http://google.com**page**)【参考方案3】:

假设我们只想支持绝对 URI 和 HTTP 请求,这里有一个函数可以满足您的需求:

public static bool IsValidURI(string uri)

    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;

【讨论】:

根据.Net来源your second check !Uri.TryCreate(uri, UriKind.Absolute, out tmp) is redundant because the IsWellFormedUriString method already contains the TryCreate method call 需要第二次检查才能使第三次(也是最后一次)检查成为可能。没有它,就没有tmp。在这种情况下,第一步可以说是多余的......【参考方案4】:

就我而言,我只是想测试 uri,我不想减慢测试 uri 的应用程序的速度。

Boolean IsValidUri(String uri)
  return Uri.IsWellFormedUriString(uri, UriKind.Absolute);

【讨论】:

【参考方案5】:

试试看:

private bool IsValidUrl(string address)
    
        return Uri.IsWellFormedUriString(address, UriKind.RelativeOrAbsolute);
    

【讨论】:

【参考方案6】:

在您的情况下,uri 参数是一个绝对路径,它引用文件位置,因此根据方法的文档,它返回 false。参考this

【讨论】:

我正在使用 UriKind.RelativeOrAbsolute 所以没关系。无论哪种方式,它都不适用于 UriKind.Relative 或 UriKind.Absolute 所以没有运气。

以上是关于如何检查uri字符串是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是对 uudecode 有效

如何在 Python 中检查字符串是不是是有效的 JSON?

IS 字符串是有效的 URL 或不是

如何检查字符串是不是是android中的有效电子邮件? [复制]

如何检查字符串是不是是有效的 XML 元素名称?

如何检查字符串是不是是有效的十六进制颜色表示?