您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 3浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2021-10-26 23:01:03 ,浏览量:3

咨询区
  • kenchilada:

我发现 framework 里有两个验证url有效性的方法:Uri.IsWellFormedUriString 和 Uri.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 用来做服务器端验证是一个绝佳的方式。

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0451s