Как насчет чего-то подобного?
function getDomain($url) {
$pieces = parse_url($url);
$domain = isset($pieces['host']) ? $pieces['host'] : '';
if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
return $regs['domain'];
}
return false;
}
Извлечет доменное имя, используя классический parse_url
, а затем будет искать действительный домен без субдоменов (www является субдоменом). Не будет работать на такие вещи, как «localhost». Вернет false, если ничего не найдено.
// Редактировать:
Попробуйте это с:
echo getDomain('http://www.google.com/test.html') . '<br/>';
echo getDomain('https://news.google.co.uk/?id=12345') . '<br/>';
echo getDomain('http://my.subdomain.google.com/directory1/page.php?id=abc') . '<br/>';
echo getDomain('https://testing.multiple.subdomain.google.co.uk/') . '<br/>';
echo getDomain('http://nothingelsethan.com') . '<br/>';
И он должен вернуть:
google.com
google.co.uk
google.com
google.co.uk
nothingelsethan.com
Конечно, он ничего не вернет, если не пройдет parse_url
, поэтому убедитесь, что это правильно сформированный URL.
// Приложение:
Альнитак прав. Представленное выше решение будет работать в большинстве случаев, но не обязательно во всех, и его необходимо поддерживать, чтобы убедиться, например, в том, что они не являются новыми TLD с символами .morethan6 и так далее. Единственный надежный способ извлечь домен - использовать поддерживаемый список, такой как http://publicsuffix.org/.. Сначала это более болезненно, но проще и надежнее в долгосрочной перспективе. Вам необходимо убедиться, что вы понимаете все плюсы и минусы каждого метода и то, как он соответствует вашему проекту.