如何检查uri字符串是否有效(您可以将其提供给Uri构造函数)?
到目前为止,我只有以下内容,但由于显而易见的原因,我更喜欢不那么粗野的方式:
Boolean IsValidUri(String uri)
{
try
{
new Uri(uri);
return true;
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了Uri.IsWellFormedUriString,但它似乎并不喜欢你可以在构造函数中抛出的所有内容.例如:
String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));
Run Code Online (Sandbox Code Playgroud)
输出将是:
Uri.IsWellFormedUriString says: False
IsValidUri says: True
Run Code Online (Sandbox Code Playgroud)
更新/应答
Uri构造函数默认使用类Absolute.当我尝试使用Uri.TryCreate和构造函数时,这导致了差异.如果匹配构造函数和TryCreate的UriKind,则会获得预期的结果.
Fra*_*nov 72
格式良好的URI意味着与某些RFC的一致性.示例中的本地路径不符合这些路径.阅读IsWellFormedUriString文档中的更多内容.
该方法的错误结果并不意味着Uri该类将无法解析输入.虽然URI输入可能不符合RFC,但它仍然可以是有效的URI.
更新:回答你的问题 - 正如Uri文档所示,有一个静态方法被调用TryCreate,它将完全按你想要的方式尝试并返回true或false(Uri如果为true则返回实际实例).
Dis*_*Dev 32
由于接受的答案没有提供明确的示例,因此这里有一些代码用于验证C#中的URI:
Uri outUri;
if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
&& (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))
{
//Do something with your validated Absolute URI...
}
Run Code Online (Sandbox Code Playgroud)
假设我们只想支持绝对URI和HTTP请求,则此函数可以满足您的要求:
public static bool IsValidURI(string uri)
{
if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
return false;
Uri tmp;
if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
return false;
return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}
Run Code Online (Sandbox Code Playgroud)