web-dev-qa-db-fra.com

PHP fonction pour obtenir le sous-domaine d'une URL

Existe-t-il une fonction dans PHP pour obtenir le nom du sous-domaine? 

Dans l'exemple suivant, j'aimerais obtenir la partie "en" de l'URL:

en.example.com
98
Damiano

Voici une solution en une ligne:

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

Ou en utilisant votre exemple:

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

EDIT: Correction "seules les variables doivent être passées par référence" en ajoutant une double parenthèse.


EDIT 2: à partir de PHP 5.4 vous pouvez simplement faire:

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

Utilise la fonction parse_url .

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

$parsedUrl = parse_url($url);

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

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

Pour plusieurs sous-domaines

$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);
57
Mike Lewis

Pour ce faire, commencez par obtenir le nom de domaine (par exemple, sub.example.com => exemple.co.uk), puis utilisez strstr pour obtenir les sous-domaines.

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

Les sorties:

0 => sub1.sub2
1 => sub1
2 =>
3 => sub1.sub2.sub3
4 => sub1.sub2.sub3
5 => sub1.sub2
31
mazon

http://php.net/parse_url

<?php
  $url = 'http://user:[email protected]/path?argument=value#anchor';
  $array=parse_url($url);
  $array['Host']=explode('.', $array['Host']);

  echo $array['Host'][0]; // returns 'en'
?>
10
JMW

Étant donné que les registraires de domaine sont la seule source fiable pour les suffixes de domaine, vous ne pouvez pas trouver le sous-domaine à leur insu .. Il existe une liste de tous les suffixes de domaine à l'adresse https://publicsuffix.org . Ce site contient également des liens vers une bibliothèque PHP: https://github.com/jeremykendall/php-domain-parser

Veuillez trouver un exemple ci-dessous. J'ai aussi ajouté l'exemple pour en.test.co.uk, qui est un domaine avec un suffixe multiple (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;
6
Sascha Frinken

La solution la plus simple et la plus rapide. 

$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_Host']);
4
user1416256
$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, '.')); 
3
Jared Farrish

Simplement ...

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

Il suffit de lire $ match [1]

Exemple de travail

Cela fonctionne parfaitement avec cette liste d'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);
}
3
Kamafeather

Pour ceux qui obtiennent "Erreur: Normes strictes: Seules les variables doivent être passées par référence."

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

1
Naseer

PHP 7.0: Utiliser la fonction exploser et créer une liste de tous les résultats.

list($subdomain,$Host) = explode('.', $_SERVER["SERVER_NAME"]);

Exemple: sub.domain.com

echo $subdomain; 

Résultat: sub

echo $Host;

Résultat: domaine

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

Comme vu dans une question précédente: Comment obtenir le premier sous-domaine avec PHP?

1
Mert Emir

c’est ma solution, elle fonctionne avec les domaines les plus courants. Vous pouvez adapter la gamme d’extensions selon vos besoins:

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

1
Sergio Lopez Loya

Ce que j'ai trouvé la solution la meilleure et courte est

array_shift(explode(".",$_SERVER['HTTP_Host']));
1
Zulqurnain abbas

Il n'y a pas vraiment de solution 100% dynamique - je viens juste d'essayer de le comprendre aussi et en raison de différentes extensions de domaine (DTL), cette tâche serait vraiment difficile sans analyser réellement toutes ces extensions et les vérifier à chaque fois:

.com vs .co.uk vs org.uk

L'option la plus fiable est de définir une constante (ou une entrée de base de données, etc.) stockant le nom de domaine actuel et de le supprimer du $_SERVER['SERVER_NAME'] à l'aide de 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, '.');

}

Maintenant, si vous utilisez cette fonction sous http://test.mymaindomain.co.uk, vous obtiendrez test ou si vous avez plusieurs niveaux de sous-domaines http://another.test.mymaindomain.co.uk, vous obtiendrez another.test - à moins bien sûr de mettre à jour la DOMAIN.

J'espère que ça aide.

1
Sebastian Sulinski
$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 />';
0
Brynner Ferreira

Je sais que je suis vraiment en retard pour le match, mais voilà.

Ce que j'ai fait était de prendre la variable de serveur HTTP_Host ($_SERVER['HTTP_Host']) et le nombre de lettres du domaine (donc pour example.com, il s'agirait de 11).

Ensuite, j'ai utilisé la fonction substr pour obtenir le sous-domaine. J'ai fait

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

J'ai coupé la sous-chaîne à 12 au lieu de 11, car les sous-chaînes commencent par 1 pour le deuxième paramètre. Alors maintenant, si vous avez entré test.example.com, la valeur de $subdomain serait test.

C'est mieux que d'utiliser explode car si le sous-domaine contient un ., cela ne le coupera pas.

0
Piccolo
// 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
0
Rahul Prasad

Nous utilisons cette fonction pour gérer plusieurs sous-domaines et plusieurs tld également gérer ip et localhost

function analyse_Host($_Host)
    {
        $my_Host   = explode('.', $_Host);
        $my_result = ['subdomain' => null, 'root' => null, 'tld' => null];

        // if Host is ip, only set as root
        if(filter_var($_Host, FILTER_VALIDATE_IP))
        {
            // something like 127.0.0.5
            $my_result['root'] = $_Host;
        }
        elseif(count($my_Host) === 1)
        {
            // something like localhost
            $my_result['root'] = $_Host;
        }
        elseif(count($my_Host) === 2)
        {
            // like jibres.com
            $my_result['root'] = $my_Host[0];
            $my_result['tld']  = $my_Host[1];
        }
        elseif(count($my_Host) >= 3)
        {
            // some conditons like
            // ermile.ac.ir
            // ermile.jibres.com
            // ermile.jibres.ac.ir
            // a.ermile.jibres.ac.ir

            // get last one as tld
            $my_result['tld']  = end($my_Host);
            array_pop($my_Host);

            // check last one after remove is probably tld or not
            $known_tld    = ['com', 'org', 'net', 'gov', 'co', 'ac', 'id', 'sch', 'biz'];
            $probably_tld = end($my_Host);
            if(in_array($probably_tld, $known_tld))
            {
                $my_result['tld'] = $probably_tld. '.'. $my_result['tld'];
                array_pop($my_Host);
            }

            $my_result['root'] = end($my_Host);
            array_pop($my_Host);

            // all remain is subdomain
            if(count($my_Host) > 0)
            {
                $my_result['subdomain'] = implode('.', $my_Host);
            }
        }

        return $my_result;
    }
0
Javad Evazzadeh

vous pouvez aussi l'utiliser

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

Supposons que l’URL actuelle = sub.example.com


 $ Host = array_reverse (explode ('.', $ _SERVER ['SERVER_NAME']))); 

 if (count ($ Host)>> 3) {
 echo "Le domaine principal est =". $ hôte [1]. ".". $ hôte [0]. "& sous-domaine est =". $ hôte [2]; 
 // Le domaine principal est = example.com & le sous-domaine est = sub 
 } autre {
 echo "Le domaine principal est =". $ hôte [1]. ".". $ hôte [0]. "& sous-domaine non trouvé"; 
 // "Le domaine principal est = exemple.com & le sous-domaine n'est pas trouvé"; 
 } 

0

Je fais quelque chose comme ça

$url = https://en.example.com

$splitedBySlash = explode('/', $url);
$splitedByDot = explode('.', $splitedBySlash[2]);

$subdomain = $splitedByDot[0];
0
Sheik Althaf

Utiliser des expressions rationnelles, des fonctions de chaîne, parse_url () ou leurs combinaisons n’est pas une vraie solution. Il suffit de tester l’une des solutions proposées avec le domaine test.en.example.co.uk, il n’y aura aucun résultat correct.

La solution correcte est le paquet d'utilisation qui analyse le domaine avec Liste de suffixes publics . Je recommande TLDExtract , voici un exemple de code:

$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'
0

si vous utilisez drupal 7 

cela vous aidera:

global $base_path;
global $base_root;  
$fulldomain = parse_url($base_root);    
$splitdomain = explode(".", $fulldomain['Host']);
$subdomain = $splitdomain[0];
0
mohanad
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);
}
0
itsazzad

À partir de PHP 5.3, vous pouvez utiliser strstr () avec true paramètre

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

Essaye ça...

$domain = 'en.example.com';
$tmp = explode('.', $domain);
$subdomain = current($tmp);
echo($subdomain);     // echo "en"
0
edCoder