Я ищу метод (или функцию), чтобы вырезать часть domain.ext любого URL-адреса, который был введен в функцию. Расширение домена может быть любым (.com, .co.uk, .nl, anywhatever), а URL, который загружается в него, может быть любым: от http://www.domain.com до www.domain.com/path /script.php?=whatever
Каков наилучший способ сделать это?
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 )
Вы можете использовать parse_url () для этого:
$url = 'http://www.example.com'; $domain = parse_url($url, PHP_URL_HOST);
В этом примере $ domain должен содержать example.com.
Вы также можете написать регулярное выражение, чтобы получить именно то, что вы хотите.
Вот моя попытка:
$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.
Вот несколько простых функций для получения корневого домена (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; }
Решил это …
Скажем, мы вызываем 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 тоже должны работать везде 🙂
Я потратил некоторое время на размышления о том, имеет ли смысл использовать регулярное выражение для этого, но, в конце концов, я думаю, что нет.
Первое выражение reresxp firstresponder приблизилось к тому, чтобы убедить меня, что это лучший способ, но он не работает ни на чем, у которого отсутствует конечная косая черта (например, http://example.com ). Я исправил это следующим образом: '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i'
, но потом я понял который дважды соответствует URL-адресам, например « http://example.com/index.htm ». К сожалению. Это было бы не так уж плохо (просто используйте первый), но он также дважды повторяется примерно так: « http://abc.ed.fg.hij.kl.mn/ », а первое совпадение – t правильный. 🙁
Сотрудник предложил просто получить хост (через parse_url()
), а затем просто взять последние два или три бита массива ( split()
on '.'). Два или три будут основаны на списке доменов, например «co.uk» и т. д. Составление этого списка становится сложной.
Существует только один правильный способ извлечения частей домена, это использование 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'