NET问答: 如何检查一个 string 是否为有效的 url 格式?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET问答: 如何检查一个 string 是否为有效的 url 格式?相关的知识,希望对你有一定的参考价值。

咨询区

  • kenchilada

我发现 framework 里有两个验证url有效性的方法:Uri.IsWellFormedUriStringUri.TryCreate ,我试了一下这两个方法在验证 文件路径 时都返回 true。

请问我有什么有效的方法可以验证某个 string 是否为有效的 HTTP URL 格式呢?

回答区

  • Erçin Dedeoğlu

可以用 Uri.TryCreate 实现,为此我写了一个扩展方法。

public static bool CheckURLValid(this string source)
    {
        Uri uriResult;
        return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
    }

然后像下面这样使用。

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}
  • 41686d6564

我发现大家的答案都有两个问题。

  1. 都允许 file://,  ftp:// 开头的 url。

  2. 如果url没有以 http://https://  开头则不能通过,eg:(google.com)

所以这并不完美,那如何解决呢?下面是我优化后的方案。

public static bool ValidHttpURL(string s, out Uri resultURI)
{
    if (!Regex.IsMatch(s, @"^https?:\\/\\/", RegexOptions.IgnoreCase))
        s = "http://" + s;

    if (Uri.TryCreate(s, UriKind.Absolute, out resultURI))
        return (resultURI.Scheme == Uri.UriSchemeHttp || 
                resultURI.Scheme == Uri.UriSchemeHttps);

    return false;
}

然后用下面的方式进行测试。

string[] inputs = new[] {
                          "https://www.google.com",
                          "http://www.google.com",
                          "www.google.com",
                          "google.com",
                          "javascript:alert('Hack me!')"
                        };
foreach (string s in inputs)
{
    Uri uriResult;
    bool result = ValidHttpURL(s, out uriResult);
    Console.WriteLine(result + "\\t" + uriResult?.AbsoluteUri);
}

输出结果。

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False

点评区

在用户表单验证中,这种需求还是非常常见的, Uri.TryCreate 用来做服务器端验证是一个绝佳的方式。

以上是关于NET问答: 如何检查一个 string 是否为有效的 url 格式?的主要内容,如果未能解决你的问题,请参考以下文章

NET问答: C# 中是否有 format json 的类库?

NET问答: 如何集中化统一验证 Authorization

NET问答: String 和 string 到底有什么区别?

NET问答: 为什么 IEnumerable<string; 不能被初始化?

是否通过强制转换为有符号的未定义行为来检测无符号环绕?

NET问答: 不能从 appsettings.json 中以 string[] 形式读取?