Подтвердить что ты не робот

Как вы удаляете имя домена из URL-адреса в php?

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

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

4b9b3361

Ответ 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'