Функция PHP для получения субдомена URL-адреса

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

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

en.example.com 

Вот однострочное решение:

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

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

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

EDIT: Исправлено: «только переменные должны передаваться по ссылке» путем добавления двойной скобки.

EDIT 2 : Начиная с PHP 5.4 вы можете просто сделать:

 explode('.', 'en.example.com')[0]; 

Использует функцию 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); 

Вы можете сделать это, сначала получив доменное имя (например, 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}\.[az\.]{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 

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' ?> 

Поскольку единственным надежным источником суффиксов домена являются регистраторы доменов, вы не можете найти субдомен без их ведома. Список со всеми суффиксами домена представлен на странице 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; 
 $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, '.')); 

Просто…

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

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

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

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

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

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

 $sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_HOST']); 

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

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

Для тех, кто получает «Ошибка: строгие стандарты: только переменные должны передаваться по ссылке». Используйте следующее:

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

 $domain = 'sub.dev.example.com'; $tmp = explode('.', $domain); // split into parts $subdomain = current($tmp); print($subdomain); // prints "sub" 

Как видно из предыдущего вопроса: Как получить первый субдомен с PHP?

На самом деле не существует 100% -ного динамического решения – я просто пытался понять это, и из-за разных расширений домена (DTL) эта задача была бы действительно сложной, не анализируя все эти расширения и не проверяя их каждый раз:

.com vs .co.uk vs org.uk

Наиболее надежным вариантом является определение константы (или записи базы данных и т. Д.), $_SERVER['SERVER_NAME'] хранит фактическое имя домена и удаляет его из $_SERVER['SERVER_NAME'] используя substr()

 defined("DOMAIN") || define("DOMAIN", 'mymaindomain.co.uk'); function getSubDomain() { if (empty($_SERVER['SERVER_NAME'])) { return null; } $subDomain = substr($_SERVER['SERVER_NAME'], 0, -(strlen(DOMAIN))); if (empty($subDomain)) { return null; } return rtrim($subDomain, '.'); } 

Теперь, если вы используете эту функцию под http://test.mymaindomain.co.uk она даст вам test или у вас будет несколько уровней поддоменов http://another.test.mymaindomain.co.uk вы будете get another.test – если, конечно, вы не обновите DOMAIN .

Надеюсь, это поможет.

Просто

reset(explode(".", $_SERVER['HTTP_HOST']))

это мое решение, оно работает с наиболее распространенными доменами, вы можете подобрать массив расширений по мере необходимости:

$ SubDomain = explode ('.', Explode ('| ext |', str_replace (array ('. Com', '.net', '.org'), '| ext |', $ _ SERVER ['HTTP_HOST'] )) [0]);

 // For www.abc.en.example.com $host_Array = explode(".",$_SERVER['HTTP_HOST']); // Get HOST as array www, abc, en, example, com array_pop($host_Array); array_pop($host_Array); // Remove com and exmaple array_shift($host_Array); // Remove www (Optional) echo implode($host_Array, "."); // Combine array abc.en 

Я знаю, что я очень опаздываю в игру, но здесь идет.

То, что я сделал, это взять переменную сервера HTTP_HOST ( $_SERVER['HTTP_HOST'] ) и количество букв в домене (так, например, для example.com это будет 11).

Затем я использовал функцию substr для получения субдомена. я сделал

 $numberOfLettersInSubdomain = strlen($_SERVER['HTTP_HOST'])-12 $subdomain = substr($_SERVER['HTTP_HOST'], $numberOfLettersInSubdomain); 

Я отрезал подстроку на 12 вместо 11, потому что подстроки начинаются на 1 для второго параметра. Итак, если вы ввели test.example.com, значение $subdomain было бы test .

Это лучше, чем использование explode потому что если у субдомена есть . в этом, это не остановит его.

если вы используете drupal 7

это поможет вам:

 global $base_path; global $base_root; $fulldomain = parse_url($base_root); $splitdomain = explode(".", $fulldomain['host']); $subdomain = $splitdomain[0]; 
 $host = $_SERVER['HTTP_HOST']; preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches); $domain = $matches[0]; $url = explode($domain, $host); $subdomain = str_replace('.', '', $url[0]); echo 'subdomain: '.$subdomain.'<br />'; echo 'domain: '.$domain.'<br />'; 

Из PHP 5.3 вы можете использовать strstr () с истинным параметром

 echo strstr($_SERVER["HTTP_HOST"], '.', true); //prints en 

Попробуй это…

 $domain = 'en.example.com'; $tmp = explode('.', $domain); $subdomain = current($tmp); echo($subdomain); // echo "en" 
 function get_subdomain($url=""){ if($url==""){ $url = $_SERVER['HTTP_HOST']; } $parsedUrl = parse_url($url); $host = explode('.', $parsedUrl['path']); $subdomains = array_slice($host, 0, count($host) - 2 ); return implode(".", $subdomains); } 

Используя регулярное выражение, строковые функции, parse_url () или их комбинации, это не реальное решение. Просто проверьте любые предлагаемые решения с помощью domain 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' 

вы можете использовать это тоже

 echo substr($_SERVER['HTTP_HOST'], 0, strrpos($_SERVER['HTTP_HOST'], '.', -5)); 

Я делаю что-то вроде этого

 $url = https://en.example.com $splitedBySlash = explode('/', $url); $splitedByDot = explode('.', $splitedBySlash[2]); $subdomain = $splitedByDot[0]; 

Если вы хотите только то, что приходит до первого периода:

 list($sub) = explode('.', 'en.example.com', 2);