我有这样的 perl 脚本:
elsif ($url =~ m/^(http|https):\/\/(banner(s?)|advertising|iklan|adsbox|adserver|adservice(s?))\.(.*)/) {
print "http:\/\/ip\.mdm\-lo\-00\.willsz\.net/null\.png\n";
}
这对重定向 squid(一行)有效,但如果像这样更改为多行,则绝对无效。
elsif ($url =~ m/^(http|https):\/\/(banner(s?) \
|advertising \
|iklan \
|adsbox \
|adserver \
|adservice(s?))\.(.*)/) {
print "http:\/\/ip\.mdm\-lo\-00\.willsz\.net/null\.png\n";
}
有什么建议吗? - 谢谢
最佳答案
您对转义符和圆括号有点着迷了!将分隔符更改为 {
...}
之类的东西要简单得多,它不在模式的主体中;那么你不必转义斜杠
除非您使用 /x
修饰符,否则所有空格在正则表达式模式中都很重要,包括换行符,转义它们根本没有区别。这不是 C!
除非您需要捕获匹配模式的子字符串,否则您还应该使用非捕获括号,如 (?:...)
而且不需要一次性的.*
来匹配字符串的尾部,除非你需要匹配并捕获它以供进一步使用
最好的选择是使用 m{...}x
。然后你可以根据需要添加空格、制表符和换行符,使模式更清晰
并且在双引号字符串中根本不需要反斜杠,除非您想添加特殊字符,例如 \t
用于制表符,\n
用于换行符等。
这段代码应该做你想做的
elsif ( $url =~ m{ ^ https?:// (?:
banners? |
advertising |
iklan |
adsbox |
adserver |
adservices? ) \. }x ) {
print "http://ip.mdm-lo-00.willsz.net/null.png\n";
}
关于regex - 继续在 perl 中换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230896/