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
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];
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);
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
<?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'
?>
É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;
La solution la plus simple et la plus rapide.
$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_Host']);
$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);
Il suffit de lire $ match [1]
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);
}
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);
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
$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?
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]);
Ce que j'ai trouvé la solution la meilleure et courte est
array_shift(explode(".",$_SERVER['HTTP_Host']));
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.
$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 />';
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.
// 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
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;
}
vous pouvez aussi l'utiliser
echo substr($_SERVER['HTTP_Host'], 0, strrpos($_SERVER['HTTP_Host'], '.', -5));
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é"; }
Je fais quelque chose comme ça
$url = https://en.example.com
$splitedBySlash = explode('/', $url);
$splitedByDot = explode('.', $splitedBySlash[2]);
$subdomain = $splitedByDot[0];
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'
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];
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);
}
À partir de PHP 5.3, vous pouvez utiliser strstr () avec true paramètre
echo strstr($_SERVER["HTTP_Host"], '.', true); //prints en
Essaye ça...
$domain = 'en.example.com';
$tmp = explode('.', $domain);
$subdomain = current($tmp);
echo($subdomain); // echo "en"