如何通过单个正则表达式验证网址:
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
等等。
答案 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
}
}