【问题标题】: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.。

      您也许可以为您特别感兴趣的域子集实施此方法。但是完整的解决方案将非常复杂并且几乎不可能保持最新状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-29
        • 2014-05-26
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 2021-09-17
        相关资源
        最近更新 更多