【问题标题】:Perl extract domain name from email address inc tld but excluding subdomainsPerl 从电子邮件地址 inc tld 中提取域名但不包括子域
【发布时间】:2013-08-07 04:52:07
【问题描述】:
我正在尝试按照标题所说的去做,我得到了这个:
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;
}
}
对于返回 domain.com 的 user@domain.com 可以正常工作,但 domain.co.uk 当然会返回 .co.uk,而我需要 domain.co.uk。关于如何继续这个的任何建议,我猜是一个模块,有些人建议某种 tld 查找表。
【问题讨论】:
标签:
regex
perl
subdomain
tld
【解决方案1】:
不要使用正则表达式。
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
【解决方案2】:
我认为你在这里不走运。 Net::Domain::TLD 会给你一个 TLD 列表,但这并不是你真正想要的。
据我了解,给定一个像 user@sub.domain.com 这样的电子邮件地址,您想要获取 domain.com。这里的 TLD 是“com”,您需要 TLD 和它之前的域部分。这很容易。
然后是 user@sub.domain.co.uk。这里的顶级域名是“英国”。但在这里,您不需要 TLD 及其前面的域部分 - 您需要 TLD 之前的两个部分。
所以也许你需要一个启发式。如果 TLD 是三个字母,则取域的前一部分,如果 TLD 是三个字母,则取前两部分。
但这也不起作用。并非所有 ccTLD 都像 .uk 那样定义了子域。以流行的 .tv ccTLD 为例。它们允许您直接在 ccTLD 下注册域。
因此,您不仅需要 TLD 列表。您还需要了解每个 TLD 适用于注册的规则。它们可能会随着时间而改变。并且正在引入新的 TLD - 您需要跟上所有这些。
哦,还有最后一点。即使是像 .uk 这样的大型 ccTLD 也不总是遵循自己的规则。有一些 .uk 域没有顶级子域 - 例如 .british-library.。
您也许可以为您特别感兴趣的域子集实施此方法。但是完整的解决方案将非常复杂并且几乎不可能保持最新状态。