我有这样的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";
}
用于重定向鱿鱼(一行),但如果更改为这样的多行,绝对不能正常工作。
elsif ($url =~ m/^(http|https):\/\/(banner(s?) \
|advertising \
|iklan \
|adsbox \
|adserver \
|adservice(s?))\.(.*)/) {
print "http:\/\/ip\.mdm\-lo\-00\.willsz\.net/null\.png\n";
}
有什么建议吗? - 谢谢
答案 0 :(得分:5)
你的逃脱和括号让你有点失望!将分隔符更改为不在模式正文中的{
... }
更为简单;那么你不必逃避斜杠
除非你使用/x
修饰符,否则所有空格在正则表达式模式中都很重要,包括换行符,并且转义它们根本没有任何区别。这不是C!
除非需要捕获匹配模式的子串,否则还应使用非(?:...)
等非捕获括号
除非您需要匹配并捕获它以供进一步使用,否则不需要抛弃.*
来匹配字符串的尾部
您最好的选择是使用m{...}x
。然后,您可以根据需要添加空格,制表符和换行符,以使模式更清晰
根本不需要双引号字符串中的反斜杠,除非你想为tab添加\t
之类的特殊字符,为换行添加\n
等。
此代码应该按您的要求执行
elsif ( $url =~ m{ ^ https?:// (?:
banners? |
advertising |
iklan |
adsbox |
adserver |
adservices? ) \. }x ) {
print "http://ip.mdm-lo-00.willsz.net/null.png\n";
}
答案 1 :(得分:1)
if ($url =~ m{
^(?:http|https)://(?:banners?|
advertising|
iklan|
adsbox|
adserver|
adservices?)\.
}x #<---- x for multi line regex
){
print "http://ip.mdm-lo-00.willsz.net/null.png\n";
}