【问题标题】:Is there a URL validator on .Net?.Net 上是否有 URL 验证器?
【发布时间】:2010-10-29 23:53:48
【问题描述】:

有没有一种方法可以在 .Net、ASP.Net 或 ASP.Net MVC 中验证 URL?

【问题讨论】:

    标签: .net asp.net asp.net-mvc validation url


    【解决方案1】:

    如果您需要来自 Arjan 的 VB.Net 中的漂亮代码

        'Validates a URL.
        Function ValidateUrl(url As String) As Boolean
            Dim validatedUri As Uri = Nothing
            If (Uri.TryCreate(url, UriKind.Absolute, validatedUri)) Then
                Return (validatedUri.Scheme = Uri.UriSchemeHttp Or validatedUri.Scheme = Uri.UriSchemeHttps)
            End If
            Return False
        End Function
    

    【讨论】:

      【解决方案2】:

      到目前为止提供的答案并未检查方案,允许各种不需要的输入,这可能使您容易受到 javascript 注入(请参阅 TheCloudlessSky 的评论)。

      URI 只是对象的唯一标识。 "C:\Test" 是一个有效的 URI。

      在我的项目中,我使用了以下代码:

      /// <summary>
      /// Validates a URL.
      /// </summary>
      /// <param name="url"></param>
      /// <returns></returns>
      private bool ValidateUrl(string url)
      {
          Uri validatedUri;
      
          if (Uri.TryCreate(url, UriKind.Absolute, out Uri validatedUri)) //.NET URI validation.
          {
              //If true: validatedUri contains a valid Uri. Check for the scheme in addition.
              return (validatedUri.Scheme == Uri.UriSchemeHttp || validatedUri.Scheme == Uri.UriSchemeHttps);
          }
          return false;
      }
      

      定义您将允许的方案并相应地更改代码。

      【讨论】:

      • +1,这是最好的答案,也是真正回答“如何验证 URL”这个问题的唯一答案,一个 URL!。
      • 你的方法验证像Http://Ftp://www.google.com这样的字符串,女巫根本没有意义=/
      【解决方案3】:

      您可以使用 Uri.IsWellFormedUriString,无需为此创建自己的函数:

      public static bool IsWellFormedUriString(string uriString, uriKind uriKind);
      

      uriKind 可以在哪里:

      UriKind.RelativeOrAbsolute 
      UriKind.Absolute
      UriKind.Relative
      

      欲了解更多信息,请参阅:http://msdn.microsoft.com/en-us/library/system.uri.iswellformeduristring.aspx

      【讨论】:

      • 这应该是公认的答案。这是 .Net 的 URL 验证器
      【解决方案4】:

      您可以使用Uri.TryCreate 来验证 URL:

      public bool IsValidUri(string uri)
      {
          Uri validatedUri;
          return Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out validatedUri);
      }
      

      cmets 建议TryCreate 只是将异常处理下移一级。但是,我检查了源代码,发现并非如此。 TryCreate 内部没有 try/catch,它使用了一个不应抛出的自定义解析器。

      【讨论】:

      • 虽然它只是把 try/catch 再往下一层,你不必看到它。
      • 我刚刚为这个 & Mehrdad 的方法做了一个简单的性能测试循环 1000 次,只使用了 1 个无效的 url,发现这个速度明显更快(快 8000 倍)。如果有人想要更详细(多个 URL 等),我会对其他结果感兴趣。
      • 这和使用Uri.IsWellFormedUriString有什么不同吗?
      • 警告:这种类型的验证确实考虑的一件事是 javascript 注入:javascript:alert('hacked')。因此,检查 javascript 协议很重要!
      • 此响应被高估了,您输入的任何内容(例如“qwerty”)都将被验证为 Url,因为实际上这种方法不会检查 Url。请参阅@Arjan 回答那些正在搜索真实网址验证的人。
      【解决方案5】:

      比使用 try/catch 功能更快的方法(可能)是使用 Regex。如果您必须验证 1000 个 URL,多次捕获异常会很慢。

      这里是a link to sample Regex- 使用 Google 查找更多信息。

      【讨论】:

      • 不知何故我对此表示怀疑。正则表达式,即使是编译的也不是特别快。即使你能写出准确的。
      • Kris——也许你不明白抛出异常有多昂贵——如果在一个大循环中完成它们会非常慢。
      • RichardOD - 您列出的示例正则表达式适用于某些 URL,但在以下 100% 有效的 URL 上失败。就像我说的,更难做对。 msdn.microsoft.com/en-us/library/zc5dc32d(VS.85).aspx
      • 我想如果性能是一个问题,你可以使用正则表达式作为第一种方法。如果 Regex 失败,则切换到 Uri.TryCreate。当我使用 Regex 时,我通常会编写一堆单元测试来检查边缘情况。
      【解决方案6】:
      static bool IsValidUri(string urlString) {
         try {
            new Uri(urlString);
            return true;
         } catch {
            return false;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 2021-11-16
        • 2020-07-04
        相关资源
        最近更新 更多