需要C#regex进行URL验证

时间:2009-12-15 07:59:16

标签: c# .net regex

如何通过单个正则表达式验证网址:

http://83.222.4.42:8880/listen.pls
http://www.my_site.com/listen.pls
http://www.my.site.com/listen.pls

是真的吗?

我看到我没有完全提出问题:(抱歉我的错误。想法是我想在regexp有效网址的帮助下验证,让它成为外部IP地址或域名。这是想法,可以考虑其他有效的网址:

http://93.122.34.342/
http://193.122.34.342/abc/1.html
http://www.my_site.com/listen2.pls
http://www.my.site.com/listen.php

等等。

6 个答案:

答案 0 :(得分:7)

通往地狱的道路铺设了字符串解析。

特别是URL解析是许多被利用的安全问题的根源。不要这样做。

例如,您想要匹配吗?

    

请注意大写方案部分。请记住,URL的某些部分区分大小写,而有些则不区分大小写。然后是编码规则。等

首先使用System.Uri来解析您提供的网址:

var uri = new Uri("http://83.222.4.42:8880/listen.pls");

然后你可以写下这样的东西:

if (uri.Scheme == "http" &&
    uri.Host == "83.222.4.42" &&
    uri.AbsolutePath == "/listen.pls"
    )
{
    // ...
}

答案 1 :(得分:1)

您的意思是任何以/listen.pls结尾的网址?在这种情况下试试这个:

^http://[^/]+/listen\.pls$

或者协议标识符必须是可选的:

^[http://]?[^/]+/listen\.pls$

无论如何看看这里,也许它对你有用:Url and Email validation using Regex

答案 2 :(得分:1)

/^http:\/\/[-_a-zA-Z0-9.]+(:\d+)?\/listen\.pls$/

答案 3 :(得分:1)

^ HTTP://.+/listen \ .PLS $

答案 4 :(得分:1)

如果严格中只有3个人不打扰正则表达式,因为当一切都已经严格知道时,不一定有良好的模式匹配 - 实际上你可能会意外地匹配超过这三个网址 - 如果网址用于安全目的或同样重要的东西,则会成为问题。相反,直接测试这三种情况 - 可能将它们放在配置文件中。

将来,如果你想在列表中添加更多的URL,你可能最终会得到一个过于复杂的正则表达式,这种表达式越来越难以维护,并且可以对一个小列表进行更简单的检查。

通过运行Regex找到这三个字符串,你不一定能获得速度提升 - 事实上它可能非常昂贵。

注意:如果您想要使用正则表达式,请尝试托管Regex Library等库的网站 - 如果您的需求发生变化,还有很多可供选择的。

答案 5 :(得分:0)

基于上面Jay Bazuzi's solution的修改版本,因为我无法在评论中发布代码,它会检查列入黑名单的扩展名(我这样做仅用于演示目的,您应该强烈考虑构建白名单而不是黑名单):

string myurl = "http://www.my_site.com/listen.pls";
Uri myUri = new Uri(myurl);
string[] invalidExtensions = {
    ".pls",
    ".abc"
};

foreach(string invalidExtension in invalidExtensions) {
    if (invalidExtension.ToLower().Equals(System.IO.Path.GetExtension(myUri.AbsolutePath))) {
        //Logic here
    }

}