Функция PHP, чтобы получить поддомен URL - PullRequest
104 голосов
/ 14 марта 2011

Есть ли в PHP функция для получения имени субдомена?

В следующем примере я хотел бы получить часть URL "en":

en.example.com

Ответы [ 28 ]

123 голосов
/ 21 июня 2012

Вот решение в одну строку:

array_shift((explode('.', $_SERVER['HTTP_HOST'])));

Или используя ваш пример:

array_shift((explode('.', 'en.example.com')));

РЕДАКТИРОВАТЬ: Исправлено «только переменные должны передаваться по ссылке» путем добавления двойнойскобки.


РЕДАКТИРОВАТЬ 2 : Начиная с PHP 5.4 вы можете просто сделать:

explode('.', 'en.example.com')[0];
60 голосов
/ 14 марта 2011

Использует функцию parse_url .

$url = 'http://en.example.com';

$parsedUrl = parse_url($url);

$host = explode('.', $parsedUrl['host']);

$subdomain = $host[0];
echo $subdomain;

Для нескольких поддоменов

$url = 'http://usa.en.example.com';

$parsedUrl = parse_url($url);

$host = explode('.', $parsedUrl['host']);

$subdomains = array_slice($host, 0, count($host) - 2 );
print_r($subdomains);
32 голосов
/ 11 сентября 2012

Вы можете сделать это, сначала получив имя домена (например, sub.example.com => example.co.uk), а затем используйте strstr для получения поддоменов.

$testArray = array(
    'sub1.sub2.example.co.uk',
    'sub1.example.com',
    'example.com',
    'sub1.sub2.sub3.example.co.uk',
    'sub1.sub2.sub3.example.com',
    'sub1.sub2.example.com'
);

foreach($testArray as $k => $v)
{
    echo $k." => ".extract_subdomains($v)."\n";
}

function extract_domain($domain)
{
    if(preg_match("/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i", $domain, $matches))
    {
        return $matches['domain'];
    } else {
        return $domain;
    }
}

function extract_subdomains($domain)
{
    $subdomains = $domain;
    $domain = extract_domain($subdomains);

    $subdomains = rtrim(strstr($subdomains, $domain, true), '.');

    return $subdomains;
}

Выходы:

0 => sub1.sub2
1 => sub1
2 =>
3 => sub1.sub2.sub3
4 => sub1.sub2.sub3
5 => sub1.sub2
10 голосов
/ 14 марта 2011

http://php.net/parse_url

<?php
  $url = 'http://user:password@sub.hostname.tld/path?argument=value#anchor';
  $array=parse_url($url);
  $array['host']=explode('.', $array['host']);

  echo $array['host'][0]; // returns 'en'
?>
6 голосов
/ 28 августа 2014

Поскольку единственным надежным источником суффиксов домена являются регистраторы доменов, вы не можете найти поддомен без их ведома.Существует список со всеми суффиксами доменов https://publicsuffix.org.. Этот сайт также ссылается на библиотеку PHP: https://github.com/jeremykendall/php-domain-parser.

. Ниже приведен пример.Я также добавил образец для en.test.co.uk, который является доменом с мульти-суффиксом (co.uk).

<?php

require_once 'vendor/autoload.php';

$pslManager = new Pdp\PublicSuffixListManager();
$parser = new Pdp\Parser($pslManager->getList());
$host = 'http://en.example.com';
$url = $parser->parseUrl($host);

echo $url->host->subdomain;


$host = 'http://en.test.co.uk';
$url = $parser->parseUrl($host);

echo $url->host->subdomain;
4 голосов
/ 28 августа 2014

Просто ...

    preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $url, $match);

Просто прочитайте $ match [1]

Рабочий пример

Отлично работает с этим списком URL

$url = array(
    'http://www.domain.com', // www
    'http://domain.com', // --nothing--
    'https://domain.com', // --nothing--
    'www.domain.com', // www
    'domain.com', // --nothing--
    'www.domain.com/some/path', // www
    'http://sub.domain.com/domain.com', // sub
    'опубликованному.значения.ua', // опубликованному ;)
    'значения.ua', // --nothing--
    'http://sub-domain.domain.net/domain.net', // sub-domain
    'sub-domain.third-Level_DomaIN.domain.uk.co/domain.net' // sub-domain
);

foreach ($url as $u) {
    preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $u, $match);
    var_dump($match);
}
4 голосов
/ 18 ноября 2012

Самое простое и быстрое решение.

$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_HOST']);
3 голосов
/ 14 марта 2011
$REFERRER = $_SERVER['HTTP_REFERER']; // Or other method to get a URL for decomposition

$domain = substr($REFERRER, strpos($REFERRER, '://')+3);
$domain = substr($domain, 0, strpos($domain, '/'));
// This line will return 'en' of 'en.example.com'
$subdomain = substr($domain, 0, strpos($domain, '.')); 
1 голос
/ 12 октября 2012

Лучшее и короткое решение, которое я нашел, это

array_shift(explode(".",$_SERVER['HTTP_HOST']));
1 голос
/ 23 июня 2016

Использование регулярных выражений, строковых функций, parse_url () или их комбинаций не является реальным решением. Просто протестируйте любое из предложенных решений с доменом test.en.example.co.uk, правильного результата не будет.

Правильным решением является использование пакета, который анализирует домен с Public Suffix List . Я рекомендую TLDExtract , вот пример кода:

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('test.en.example.co.uk');
$result->getSubdomain(); // will return (string) 'test.en'
$result->getSubdomains(); // will return (array) ['test', 'en']
$result->getHostname(); // will return (string) 'example'
$result->getSuffix(); // will return (string) 'co.uk'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...