Как вы удаляете имя домена из URL-адреса в php?
Я ищу метод (или функцию), чтобы вырезать часть domain.ext любого URL-адреса, который был введен в функцию. Расширение домена может быть любым (.com,.co.uk,.nl, anywhatever), а URL-адрес, который загружается в него, может быть любым из http://www.domain.com на www.domain.com/path/script.php? = whatever
Каков наилучший способ сделать это?
Ответы
Ответ 1
parse_url превращает URL-адрес в ассоциативный массив:
php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane";
php > $blah = parse_url($foo);
php > print_r($blah);
Array
(
[scheme] => http
[host] => www.example.com
[path] => /foo/bar
[query] => hat=bowler&accessory=cane
)
Ответ 2
Вы можете использовать parse_url(), чтобы сделать это:
$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_HOST);
В этом примере $domain должен содержать example.com.
Ответ 3
Вы также можете написать регулярное выражение, чтобы получить именно то, что вы хотите.
Вот моя попытка:
$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
$url = 'http://www.example.com/foo/bar?hat=bowler&accessory=cane';
if (preg_match($pattern, $url, $matches) === 1) {
echo $matches[0];
}
Вывод:
example.com
В этом шаблоне также учитываются такие домены, как "example.com.au".
Примечание. Я не обращался к соответствующему RFC.
Ответ 4
Вот несколько простых функций для получения корневого домена (example.com) из обычного или длинного домена (test.sub.domain.com) или URL-адреса (http://www.example.com).
/**
* Get root domain from full domain
* @param string $domain
*/
public function getRootDomain($domain)
{
$domain = explode('.', $domain);
$tld = array_pop($domain);
$name = array_pop($domain);
$domain = "$name.$tld";
return $domain;
}
/**
* Get domain name from url
* @param string $url
*/
public function getDomainFromUrl($url)
{
$domain = parse_url($url, PHP_URL_HOST);
$domain = $this->getRootDomain($domain);
return $domain;
}
Ответ 5
Решено...
Скажем, что мы вызываем dev.mysite.com, и мы хотим извлечь 'mysite.com'
$requestedServerName = $_SERVER['SERVER_NAME']; // = dev.mysite.com
$thisSite = explode('.', $requestedServerName); // site name now an array
array_shift($thisSite); //chop off the first array entry eg 'dev'
$thisSite = join('.', $thisSite); //join it back together with dots ;)
echo $thisSite; //outputs 'mysite.com'
Работы с mysite.co.uk тоже должны работать везде:)
Ответ 6
Я потратил некоторое время на размышления о том, имеет ли смысл использовать регулярное выражение для этого, но, в конце концов, я думаю, что нет.
firstresponder regexp приблизился к тому, чтобы убедить меня, что это лучший способ, но он не работал ни с чем, у которого отсутствовала конечная косая черта (поэтому http://example.com, например). Я исправил это следующим образом: '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i'
, но потом я понял, что соответствует дважды для URL-адресов, таких как http://example.com/index.htm '. К сожалению. Это было бы не так уж плохо (просто используйте первый), но он также дважды совпадает с чем-то вроде этого: " http://abc.ed.fg.hij.kl.mn/ ', и первое совпадение неверно.: (
Сотрудник предложил просто получить хост (через parse_url()
), а затем просто взять последние два или три бита массива (split()
on '.'). Два или три будут основаны на списке доменов, таких как "co.uk" и т.д. Составление этого списка становится трудной частью.
Ответ 7
Существует только один правильный способ извлечения частей домена, он использует Public Suffix List (база данных TLD). Я рекомендую TLDExtract пакет, вот пример кода:
$extract = new LayerShifter\TLDExtract\Extract();
$result = $extract->parse('www.domain.com/path/script.php?=whatever');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'domain'
$result->getSuffix(); // will return (string) 'com'