C#,除了IsWellFormedUriString之外,是否有更好的验证URL格式的方法?

13

有没有更好/更准确/更严格的方法/方式来确定一个URL是否格式正确?

使用:

bool IsGoodUrl = Uri.IsWellFormedUriString(url, UriKind.Absolute);

并不是所有的URL都能被过滤掉。如果我输入htttp://www.google.com,然后运行该过滤器,它会通过。但当调用WebRequest.Create时,稍后就会出现NotSupportedException

这个不良的URL也可以通过下面的代码(这是我能找到的唯一另一个过滤器):

Uri nUrl = null;
if (Uri.TryCreate(url, UriKind.Absolute, out nUrl))
{
    url = nUrl.ToString(); 
}

你可能已经注意到了,但是你的url多了一个't'。对于其他试图复制粘贴解决方案的人,请确保将其更改为“http”或“https”。 - computerGuyCJ
4个回答

14

Uri.IsWellFormedUriString("htttp://www.google.com", UriKind.Absolute) 返回 true 的原因是它的格式符合有效的 Uri 标准。URI 和 URL 不同。

参见:URI 和 URL 有什么区别?

在您的情况下,我会检查 new Uri("htttp://www.google.com").Scheme 是否等于 httphttps


哦,哇...这是好消息。我之前只是“假设”它是同一件事的不同名称(我真是太蠢了...)。 - PiZzL3
@PiZzL3 - 直到我研究它(为了回答我链接的问题),我才意识到它们之间的区别。请参见我的编辑,以测试“Scheme”的值。 - Greg
@PiZzL3 - 我不知道还有哪些陷阱。无效的服务器可能会出现问题,但在尝试访问它之前,你可能不知道一个服务器是否有效。 - Greg

8

从技术上讲,htttp://www.google.com 是一个格式正确的URL,符合URL规范。抛出NotSupportedException异常是因为htttp不是已注册的协议。如果它是格式错误的URL,则会得到UriFormatException异常。如果你只关心HTTP(S) URL,则也需要检查协议。


我想这是可以的。我只希望它根据可用的内容进行过滤,而不是按规格进行过滤。 - PiZzL3

4

@Greg的解决方案是正确的。然而,您可以使用URI并验证您想要作为有效的所有协议(scheme)。

public static bool Url(string p_strValue)
{
    if (Uri.IsWellFormedUriString(p_strValue, UriKind.RelativeOrAbsolute))
    {
        Uri l_strUri = new Uri(p_strValue);
        return (l_strUri.Scheme == Uri.UriSchemeHttp || l_strUri.Scheme == Uri.UriSchemeHttps);
    }
    else
    {
        return false;
    }
}

-2

这段代码对我来说很好用,可以检查一个 Textbox 是否具有有效的URL格式

if((!string.IsNullOrEmpty(TXBProductionURL.Text)) && (Uri.IsWellFormedUriString(TXBProductionURL.Text, UriKind.Absolute)))
{
     // assign as valid URL                
     isValidProductionURL = true; 

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接