По сути, вы хотите:
google.com -> google.com -> google
www.google.com -> google.com -> google
google.co.uk -> google.co.uk -> google
www.google.co.uk -> google.co.uk -> google
www.google.org -> google.org -> google
www.google.org.uk -> google.org.uk -> google
Дополнительно:
www.google.com -> google.com -> www.google
images.google.com -> google.com -> images.google
mail.yahoo.co.uk -> yahoo.co.uk -> mail.yahoo
mail.yahoo.com -> yahoo.com -> mail.yahoo
www.mail.yahoo.com -> yahoo.com -> mail.yahoo
Вам не нужно создавать постоянно меняющееся регулярное выражение, поскольку 99% доменов будут сопоставлены правильно, если вы просто посмотрите на 2-ю последнюю часть имени:
(co|com|gov|net|org)
Если это одна из них, то вам нужно сопоставить 3 точки, иначе 2. Простая. Теперь мое волшебство с регулярными выражениями не подходит для других SO, поэтому я нашел лучший способ добиться этого с помощью некоторого кода, предполагая, что вы уже удалили путь:
my @d=split /\./,$domain; # split the domain part into an array
$c=@d; # count how many parts
$dest=$d[$c-2].'.'.$d[$c-1]; # use the last 2 parts
if ($d[$c-2]=~m/(co|com|gov|net|org)/) { # is the second-last part one of these?
$dest=$d[$c-3].'.'.$dest; # if so, add a third part
};
print $dest; # show it
Чтобы просто получить имя, согласно вашему вопросу:
my @d=split /\./,$domain; # split the domain part into an array
$c=@d; # count how many parts
if ($d[$c-2]=~m/(co|com|gov|net|org)/) { # is the second-last part one of these?
$dest=$d[$c-3]; # if so, give the third last
$dest=$d[$c-4].'.'.$dest if ($c>3); # optional bit
} else {
$dest=$d[$c-2]; # else the second last
$dest=$d[$c-3].'.'.$dest if ($c>2); # optional bit
};
print $dest; # show it
Мне нравится этот подход, потому что он не требует обслуживания. Если вы не хотите проверить, что это действительно законный домен, но это бессмысленно, потому что вы, скорее всего, используете это только для обработки файлов журналов, и недопустимый домен в первую очередь туда не попадет.
Если вы хотите сопоставить «неофициальные» субдомены, такие как bozo.za.net или bozo.au.uk, bozo.msf.ru просто добавьте (za | au | msf) к регулярному выражению.
Мне бы очень хотелось, чтобы кто-то сделал все это, используя просто регулярное выражение, я уверен, что это возможно.