A generic one? "co.uk", "com.cn", "ht.tg" are not generic. To do it completely you'd need a database.
or even alter it:
function get_2ld($url)
{
$anom_arr = array('uk', 'ca', 'tg');
$parse_arr = parse_url($url);
$host_arr = explode('.', $parse_arr['host']);
$ct = count($host_arr);
$domain = $host_arr[$ct - 2] . '.' . $host_arr[$ct - 1];
if (in_array($host_arr[$ct - 1] == 'uk') {
$domain = $host_arr[$ct - 3] . '.' . $domain;
}
return $domain;
}