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