Как сделать эту функцию PHP для парсинга почти идеальной?

Эта функция отличная, но ее основным недостатком является то, что она не обрабатывает домены, заканчивающиеся на .co.uk или .com.au. Как его можно изменить, чтобы справиться с этим?

function parseUrl($url) { $r = "^(?:(?P<scheme>\w+)://)?"; $r .= "(?:(?P<login>\w+):(?P<pass>\w+)@)?"; $r .= "(?P<host>(?:(?P<subdomain>[-\w\.]+)\.)?" . "(?P<domain>[-\w]+\.(?P<extension>\w+)))"; $r .= "(?::(?P<port>\d+))?"; $r .= "(?P<path>[\w/-]*/(?P<file>[\w-]+(?:\.\w+)?)?)?"; $r .= "(?:\?(?P<arg>[\w=&]+))?"; $r .= "(?:#(?P<anchor>\w+))?"; $r = "!$r!"; preg_match ( $r, $url, $out ); return $out; } 

Чтобы прояснить мою причину для поиска чего-то другого, кроме parse_url (), я хочу, чтобы вырезать (возможно, несколько) поддоменов.

 print_r(parse_url('sub1.sub2.test.co.uk')); 

Результаты в:

 Array( [scheme] => http [host] => sub1.sub2.test.co.uk ) 

То, что я хочу извлечь, это «test.co.uk» (sans subdomains), поэтому сначала использование parse_url является бессмысленным дополнительным шагом, где вывод такой же, как и вход.