Как вы удаляете доменное имя из URL в php? - PullRequest
43 голосов
/ 07 октября 2008

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

Какой лучший способ сделать это?

Ответы [ 7 ]

90 голосов
/ 07 октября 2008

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
)
11 голосов
/ 07 октября 2008

Вы можете использовать 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

10 голосов
/ 10 октября 2008

Вы также можете написать регулярное выражение, чтобы получить именно то, что вы хотите.

Вот моя попытка:

$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.

2 голосов
/ 05 декабря 2011

Вот пара простых функций для получения корневого домена (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;
}
1 голос
/ 04 декабря 2010

Решено это ...

Скажем, мы звоним на 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, поэтому должен работать везде :)

0 голосов
/ 27 июня 2016

Существует только один правильный способ извлечения частей домена, это использование 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'
0 голосов
/ 25 августа 2010

Я потратил некоторое время на размышления о том, имеет ли смысл использовать для этого регулярное выражение, но, в конце концов, я думаю, что нет.

Регулярное выражение первого респондента почти убедило меня, что это лучший способ, но оно не сработало ни с чем, кроме пропуска косой черты (например, 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» и т. д. Составление этого списка становится сложной частью.

...