Regex Perl从电子邮件地址inc tld提取域名,但不包括子域

Regex Perl从电子邮件地址inc tld提取域名,但不包括子域,regex,perl,subdomain,tld,Regex,Perl,Subdomain,Tld,我试着按照标题所说的去做,我得到了: sub getDomain { my $scalarRef = shift; my @from_domain = split(/\@/,$$scalarRef); if($from_domain[1] =~ m/^.*?(\w+\.\w+)$/){ print "$from_domain[1] $1" if($username eq 'xxx'); return $1; } } 适合user@

我试着按照标题所说的去做,我得到了:

sub getDomain {

    my $scalarRef = shift;
    my @from_domain = split(/\@/,$$scalarRef);

    if($from_domain[1] =~ m/^.*?(\w+\.\w+)$/){
       print "$from_domain[1] $1" if($username eq 'xxx');
       return $1;
    }
}
适合user@domain.com返回domain.com,但domain.co.uk当然会返回.co.uk,我需要domain.co.uk。任何关于如何进行此操作的建议,我猜是一个模块,有些建议是某种tld查找表。

不要使用RegExp

use Email::Address;
my ($addr) = Email::Address->parse('foo@domain.co.uk');
print "Domain: ".$addr->host."\n";
print "User:   ".$addr->user."\n";
印刷品:

Domain: domain.co.uk
User:   foo
不要使用RegExp

use Email::Address;
my ($addr) = Email::Address->parse('foo@domain.co.uk');
print "Domain: ".$addr->host."\n";
print "User:   ".$addr->user."\n";
印刷品:

Domain: domain.co.uk
User:   foo

我想你在这里运气不好。将为您提供TLD列表,但实际上这不是您想要的

据我所知,如果有一个电子邮件地址user@sub.domain.com,您想获取domain.com。这里的TLD是“com”,您需要TLD及其前面的域的部分。那很容易

然后是user@sub.domain.co.uk. 此处TLD为“英国”。但是在这里,您不需要TLD和它前面的域的部分-您需要在TLD之前有两个部分

所以也许你需要一个启发。如果TLD有三个字母长,则取域的前一部分;如果TLD有三个字母长,则取前两部分

但这也不行。并非所有的CCTLD都像.uk那样定义了子域。以流行的.tv ccTLD为例。它们允许您直接在ccTLD下注册域

所以你不需要一个TLD列表。您还需要了解每个TLD适用于注册的规则。它们可能会随着时间的推移而改变。新的TLD正在被引入-您需要跟上所有这些

哦,还有最后一点。即使是像.uk这样的大型CCTL也不总是遵循自己的规则。有一些.uk域没有顶级子域-.british-library。例如


您可能能够为您特别感兴趣的域子集实现这一点。但是一个完整的解决方案将是极其复杂的,而且几乎不可能跟上时代的发展。

我认为你在这里运气不好。将为您提供TLD列表,但实际上这不是您想要的

据我所知,如果有一个电子邮件地址user@sub.domain.com,您想获取domain.com。这里的TLD是“com”,您需要TLD及其前面的域的部分。那很容易

然后是user@sub.domain.co.uk. 此处TLD为“英国”。但是在这里,您不需要TLD和它前面的域的部分-您需要在TLD之前有两个部分

所以也许你需要一个启发。如果TLD有三个字母长,则取域的前一部分;如果TLD有三个字母长,则取前两部分

但这也不行。并非所有的CCTLD都像.uk那样定义了子域。以流行的.tv ccTLD为例。它们允许您直接在ccTLD下注册域

所以你不需要一个TLD列表。您还需要了解每个TLD适用于注册的规则。它们可能会随着时间的推移而改变。新的TLD正在被引入-您需要跟上所有这些

哦,还有最后一点。即使是像.uk这样的大型CCTL也不总是遵循自己的规则。有一些.uk域没有顶级子域-.british-library。例如

您可能能够为您特别感兴趣的域子集实现这一点。但一个完整的解决方案将是难以置信的复杂,几乎不可能跟上时代的步伐