Эта функция отличная, но ее основным недостатком является то, что она не обрабатывает домены, заканчивающиеся на .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 является бессмысленным дополнительным шагом, где вывод такой же, как и вход.