2013-08-07 2 views
1

Я пытаюсь делать то, что название говорит, и я получил это:Perl извлечь имя домена из адреса электронной почты ИНК 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; 
    } 
} 

отлично работает для [email protected] возвращения домена. com, но, конечно, domain.co.uk вернется .co.uk, и мне нужно domain.co.uk. Любые предложения о том, как продолжить работу с этим, я угадываю модуль, а некоторые предлагают какую-то таблицу поиска tld.

ответ

7

Не используйте RegExp.

use Email::Address; 
my ($addr) = Email::Address->parse('[email protected]'); 
print "Domain: ".$addr->host."\n"; 
print "User: ".$addr->user."\n"; 

Печать:

Domain: domain.co.uk 
User: foo 
1

Я думаю, что вы не повезло здесь. Net::Domain::TLD предоставит вам список TLD, но это не то, что вы хотите.

Как я понимаю, учитывая адрес электронной почты, такой как [email protected], вы хотите получить domain.com. TLD здесь «com», и вы хотите, чтобы TLD и раздел домена, который был до него. Это легко.

А затем есть [email protected] Здесь TLD является «uk». Но здесь вам не нужен TLD и раздел домена, который предшествует ему - вам нужно два раздела перед TLD.

Так что, возможно, вам нужна эвристика. Если TLD имеет длину в три буквы, возьмите предыдущий раздел домена, и если TLD имеет длину в три буквы, возьмите предыдущие два раздела.

Но это тоже не работает. Не все ccTLD имеют определенные поддомены, такие как .uk. Возьмите, к примеру, популярный ctTLD .tv. Они позволяют вам регистрировать домен непосредственно под ccTLD.

Для этого вам не нужен список TLD. Вам также необходимо понять правила, которые каждый из TLD применяется к регистрации. И со временем они могут меняться. И вводятся новые TLD - вам нужно идти в ногу со всеми этими.

О, и один последний пункт. Даже большие ccTLD, такие как .uk, не всегда следуют своим собственным правилам. Есть несколько доменов .uk, у которых нет субдомена верхнего уровня - .british-library.for например.

Возможно, вы сможете реализовать это для подмножества доменов, которые вас особенно интересуют. Но полное решение было бы невероятно сложным и почти невозможным для обновления.

Смежные вопросы