咨询区
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:
我发现大家的答案都有两个问题。
都允许
file://
,ftp://
开头的 url。如果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
用来做服务器端验证是一个绝佳的方式。