题 .Net上有URL验证器吗?


有没有一种方法来验证.Net,ASP.Net或ASP.Net MVC中的URL?


33
2018-05-29 19:59


起源




答案:


你可以使用 Uri.TryCreate 验证URL:

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

评论表明 TryCreate 只是将异常处理向下移动一级。但是,我检查了源代码,发现事实并非如此。内部没有尝试/捕获 TryCreate,它使用一个不应该抛出的自定义解析器。


43
2018-05-29 20:08



虽然它只是将try / catch更低一级,但你不必看到它。 - great_llama
我只是为这个和Mehrdad的方法做了一个简单的perf测试循环1000次,只使用了1个无效的url,发现这个显着更快(8000倍快)。如果有人想要更详细(多个网址等等),我会对其他一些结果感兴趣 - Nathan Koop
这无论如何与使用不同 Uri.IsWellFormedUriString? - Hosam Aly
警告:这种类型的验证有一点 不 帐户是javascript注入: javascript:alert('hacked')。因此,检查JavaScript协议很重要! - TheCloudlessSky
这种反应被高估了,你提出的任何东西,例如“qwerty”都将被验证为Url,因为这种方法实际上不会检查Url。请参阅@Arjan,回答那些正在搜索真实网址验证的人。 - ElektroStudios


因此提供的答案不会检查方案,允许各种不需要的输入,这可能使您容易被javascript注入(请参阅TheCloudlessSky的评论)。

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

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

/// <summary>
/// Validate a URL.
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private bool ValidUrl(string url)
{
    Uri validatedUri;

    if (Uri.TryCreate(url, UriKind.Absolute, out 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;
}

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


32
2018-05-03 09:25



+1,这是最好的答案,也是真正回答“如何验证网址”这一问题的唯一答案 网址! - ElektroStudios


您可以使用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


13
2018-02-21 22:24



这在许多情况下都不起作用 - Farshid


static bool IsValidUri(string urlString) {
   try {
      new Uri(urlString);
      return true;
   } catch {
      return false;
   }
}

0
2018-05-29 20:02



请参阅有关divo答案的表现的评论 - Nathan Koop


比使用try / catch功能更快的方法(可能)是使用Regex。如果必须多次验证1000个URL,那么多次访问将会很慢。

这里的 样本正则表达式的链接 - 使用Google查找更多信息。


0
2018-05-29 20:05



不知怎的,我怀疑。正则数据集,甚至编译都不是特别快。即使你能写出一个准确的。 - Kris
这样会更快,但要做得更难。 - Joel Mueller
克里斯 - 也许你不明白抛出异常的代价是多少 - 如果在大循环中完成它们会很慢。 - RichardOD
RichardOD - 您列出的示例正则表达式适用于某些URL,但在以下100%有效URL上失败。就像我说的那样,更难做对。 msdn.microsoft.com/en-us/library/zc5dc32d(VS.85).aspx - Joel Mueller
我想如果性能是一个问题,你可以使用正则表达式作为第一种方法。如果正则表达式失败,则切换到Uri.TryCreate。当我使用正则表达式时,我通常会编写一堆单元测试来检查边缘情况。 - RichardOD