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

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

Как лучше всего это сделать?

возможный дубликат PHP получение доменного имени из поддомена

tripleee 15.08.2013 12:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
51
1
57 256
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

Darryl Hein 07.10.2008 01:39

Примечание: второй аргумент parse_url - изобретение PHP5. Любой, кто пользуется PHP4 (обновите, пожалуйста, ради Бога ...), должен будет использовать способ Роберта Элвелла.

ceejayoz 07.10.2008 02:36

Любой, кто использует PHP4 ... должен будет обновиться.

Kent Fredric 07.10.2008 03:38

$ domain содержит www.example.com.

Gary 10.03.2012 04:23
Ответ принят как подходящий

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; }

user15063 07.10.2008 02:08

@Yegor: $ domain = preg_replace ('/ ^ www./','',$domain);

Kent Fredric 07.10.2008 03:37

Я люблю взорваться на www. а затем сам использовать первый экземпляр в массиве. Обычно он работает нормально.

Robert Elwell 07.10.2008 06:12

Осторожный Роберт, так как многие URls не имеют перед собой www. т.е. images.google.com

gradbot 07.10.2008 06:22

Да, как правило, для моих целей это цель, поскольку субдомен без www довольно информативен в отношении контента, отображаемого в этой части сайта.

Robert Elwell 07.10.2008 22:07

Небольшая проблема с вашим предложением, Роберт. Он не найдет хост, если в URL-адресе нет http: //.

user15063 09.10.2008 00:30

Вы можете проверить, начинается ли URL с HTTP, выполнив - if (strpos ($ url, 'http: //') === 0); вы также можете сделать то же самое для HTTPS, если его нет, вы можете добавить его, а затем запустить через parse_url.

Klinky 04.12.2010 19:22

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

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

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

Это лучшее решение для всех случаев. Спасибо

Jared Eitnier 27.02.2013 19:08

Могу ли я использовать этот шаблон регулярного выражения на другом языке?

User 28.03.2014 23:26

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

Регулярное выражение 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

jaredstenquist 25.04.2013 01:31

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

Другие вопросы по теме