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

咨询区

  • 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 用来做服务器端验证是一个绝佳的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值