Perl 正则表达式排除 Spamassassin 的某些 TLD
Perl Regex to Exclude Certain TLDs for Spamassassin
我全部都无法用 Perl 编写代码;所以,这似乎是一件简单的事情——编写一个正则表达式来为 "com" 或 "net" 或 "org" TLD 的所有 而不是 的 URI 评分 - - 显然超出了我的能力范围。有哪位好心人能赐教吗?
例如,我希望 https://foo.com.us/asdf?qwerty=123
匹配而 ftp://madeup.kernel.org/path/to/some/tarball.tar.bz2
不匹配。
您应该使用 URI
模块将主机名与 URL
的其余部分分开
此示例仅提取主机名的最后一个子字符串,因此它会从 bbc.co.uk
中查看 uk
,但它应该符合您的目的
use strict;
use warnings;
use URI;
my @urls = qw{
https://foo.com.us/asdf?qwerty=123
ftp://madeup.kernel.org/path/to/some/tarball.tar.bz2
};
for my $url ( @urls ) {
$url = URI->new($url);
my $host = $url->host;
my ($tld) = $host =~ /([^.]+)\z/;
if ( $tld !~ /^(?com|net|org)\z/ ) {
# non-standard TLD
}
}
正则表达式模式
//(?:[a-z]+\.)*+(?!com/|net/|org/)
应该做你想做的。斜杠是模式的一部分,不是分隔符
这里有演示
use strict;
use warnings;
use 5.010;
my @urls = qw{
https://foo.com.us/asdf?qwerty=123
ftp://madeup.kernel.org/path/to/some/tarball.tar.bz2
};
for ( @urls ) {
say m{//(?:[a-z]+\.)*+(?!com/|net/|org/)} ? 'match' : 'no match';
}
产出
match
no match
我全部都无法用 Perl 编写代码;所以,这似乎是一件简单的事情——编写一个正则表达式来为 "com" 或 "net" 或 "org" TLD 的所有 而不是 的 URI 评分 - - 显然超出了我的能力范围。有哪位好心人能赐教吗?
例如,我希望 https://foo.com.us/asdf?qwerty=123
匹配而 ftp://madeup.kernel.org/path/to/some/tarball.tar.bz2
不匹配。
您应该使用 URI
模块将主机名与 URL
此示例仅提取主机名的最后一个子字符串,因此它会从 bbc.co.uk
中查看 uk
,但它应该符合您的目的
use strict;
use warnings;
use URI;
my @urls = qw{
https://foo.com.us/asdf?qwerty=123
ftp://madeup.kernel.org/path/to/some/tarball.tar.bz2
};
for my $url ( @urls ) {
$url = URI->new($url);
my $host = $url->host;
my ($tld) = $host =~ /([^.]+)\z/;
if ( $tld !~ /^(?com|net|org)\z/ ) {
# non-standard TLD
}
}
正则表达式模式
//(?:[a-z]+\.)*+(?!com/|net/|org/)
应该做你想做的。斜杠是模式的一部分,不是分隔符
这里有演示
use strict;
use warnings;
use 5.010;
my @urls = qw{
https://foo.com.us/asdf?qwerty=123
ftp://madeup.kernel.org/path/to/some/tarball.tar.bz2
};
for ( @urls ) {
say m{//(?:[a-z]+\.)*+(?!com/|net/|org/)} ? 'match' : 'no match';
}
产出
match
no match