Я ищу метод (или функцию), чтобы вырезать часть domain.ext из любого URL-адреса, который вводится в функцию. Расширение домена может быть любым (.com, .co.uk, .nl, .w независимо), а вводимый в него URL может быть любым, от http://www.domain.com до www.domain.com/path/script.php?=w независимо
Как лучше всего это сделать?






Вы можете использовать parse_url () для этого:
$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_HOST);
$domain = str_replace('www.','',$domain);
В этом примере $ domain должен содержать example.com, независимо от того, имеет он www или нет. Это также работает для домена, такого как .co.uk.
Разве это не должно быть parse_url () вместо url_parse ()
Примечание: второй аргумент parse_url - изобретение PHP5. Любой, кто пользуется PHP4 (обновите, пожалуйста, ради Бога ...), должен будет использовать способ Роберта Элвелла.
Любой, кто использует PHP4 ... должен будет обновиться.
$ domain содержит www.example.com.
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
)
Как лучше всего избавиться от www. часть, если она присутствует в домене. IM не очень хорошо работает с регулярным выражением. Я могу придумать беспорядочный способ: $ www_check = substr ($ domain, 0,4); если ($ www_check == "www.") {echo substr ($ domain, 4); } else {echo $ domain; }
@Yegor: $ domain = preg_replace ('/ ^ www./','',$domain);
Я люблю взорваться на www. а затем сам использовать первый экземпляр в массиве. Обычно он работает нормально.
Осторожный Роберт, так как многие URls не имеют перед собой www. т.е. images.google.com
Да, как правило, для моих целей это цель, поскольку субдомен без www довольно информативен в отношении контента, отображаемого в этой части сайта.
Небольшая проблема с вашим предложением, Роберт. Он не найдет хост, если в URL-адресе нет http: //.
Вы можете проверить, начинается ли URL с HTTP, выполнив - if (strpos ($ url, 'http: //') === 0); вы также можете сделать то же самое для HTTPS, если его нет, вы можете добавить его, а затем запустить через parse_url.
Вы также можете написать регулярное выражение, чтобы получить именно то, что вам нужно.
Вот моя попытка:
$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.
Это лучшее решение для всех случаев. Спасибо
Могу ли я использовать этот шаблон регулярного выражения на другом языке?
Я потратил некоторое время на размышления о том, имеет ли смысл использовать для этого регулярное выражение, но, в конце концов, думаю, что нет.
Регулярное выражение firstresponder было близко к тому, чтобы убедить меня, что это лучший способ, но оно не сработало ни с чем, у кого отсутствует завершающая косая черта (например, 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() на '.'). Два или три будут основаны на списке доменов, например 'co.uk 'и т. д. Составление этого списка становится сложной частью.
Решил это ...
Допустим, мы звоним на 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, поэтому должен работать везде :)
Не работает с двумя доменами верхнего уровня, если у вас также нет поддомена. www.mydomain.co.uk // outputs 'mydomain.co.uk' mydomain.co.uk // outputs co.uk
Вот несколько простых функций для получения корневого домена (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;
}
Есть только один правильный способ извлечения частей домена - это использовать Список общедоступных суффиксов (база данных 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'
Эта функция должна работать:
function Delete_Domain_From_Url($Url = false)
{
if ($Url)
{
$Url_Parts = parse_url($Url);
$Url = isset($Url_Parts['path']) ? $Url_Parts['path'] : '';
$Url .= isset($Url_Parts['query']) ? "?".$Url_Parts['query'] : '';
}
return $Url;
}
Чтобы использовать это:
$Url = "https://stackoverflow.com/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php";
echo Delete_Domain_From_Url($Url);
# Output:
#/questions/176284/how-do-you-strip-out-the-domain-name-from-a-url-in-php
Следующий код удалит протокол, домен и порт из абсолютного URL:
$urlWithoutDomain = preg_replace('#^.+://[^/]+#', '', $url);
возможный дубликат PHP получение доменного имени из поддомена