it-swarm.com.de

PHP Funktion, um die Unterdomäne einer URL abzurufen

Gibt es eine Funktion in PHP, um den Namen der Subdomain zu ermitteln? 

Im folgenden Beispiel möchte ich den "en" -Teil der URL erhalten:

en.example.com
98
Damiano

Hier ist eine einzeilige Lösung:

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

Oder anhand deines Beispiels:

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

EDIT: Feste "nur Variablen sollten als Referenz übergeben werden" durch Hinzufügen von doppelten Klammern.


EDIT 2: Ausgehend von PHP 5.4 können Sie einfach Folgendes tun:

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

Verwendet die Funktion parse_url .

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

$parsedUrl = parse_url($url);

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

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

Für mehrere Subdomains

$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

Sie können dies tun, indem Sie zunächst den Domänennamen abrufen (z. B. sub.example.com => example.co.uk) und dann mit strstr die Subdomains abrufen.

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

Ausgänge:

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

Die einzige zuverlässige Quelle für Domain-Suffixe sind die Domain-Registrare. Sie können die Sub-Domain ohne ihr Wissen nicht finden. Eine Liste mit allen Domain-Suffixen finden Sie unter https://publicsuffix.org . Diese Site ist auch mit einer PHP - Bibliothek verknüpft: https://github.com/jeremykendall/php-domain-parser

Hier finden Sie ein Beispiel. Ich habe auch das Beispiel für en.test.co.uk hinzugefügt, bei dem es sich um eine Domäne mit einem Multi-Suffix (co.uk) handelt.

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

Einfachste und schnellste Lösung. 

$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

Einfach...

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

Lesen Sie einfach $ match [1]

Arbeitsbeispiel

Es funktioniert perfekt mit dieser Liste von URLs

$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

Einfach

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

1
Adam F

Für diejenigen, die "Fehler: Strikte Standards" erhalten, sollten nur Variablen als Verweis übergeben werden. "

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

1
Naseer

PHP 7.0: Verwenden Sie die Explosionsfunktion und erstellen Sie eine Liste aller Ergebnisse.

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

Beispiel: sub.domain.com

echo $subdomain; 

Ergebnis: Sub

echo $Host;

Ergebnis: Domäne

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

Wie in einer vorherigen Frage zu sehen: Wie bekomme ich die erste Subdomain mit PHP?

1
Mert Emir

dies ist meine Lösung, sie funktioniert mit den gebräuchlichsten Domänen. Sie können das Array von Erweiterungen nach Bedarf anpassen:

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

1

Was ich gefunden habe, ist die beste und kurze Lösung

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

Es gibt nicht wirklich eine zu 100% dynamische Lösung - ich habe nur versucht, es auch herauszufinden, und aufgrund verschiedener Domain-Erweiterungen (DTL) wäre diese Aufgabe sehr schwierig, ohne all diese Erweiterungen zu analysieren und jedes Mal zu überprüfen:

.com vs .co.uk vs org.uk

Die zuverlässigste Option besteht darin, eine Konstante (oder einen Datenbankeintrag usw.) zu definieren, in der der tatsächliche Domänenname gespeichert wird, und ihn mit substr() aus dem $_SERVER['SERVER_NAME'] zu entfernen.

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, '.');

}

Wenn Sie nun diese Funktion unter http://test.mymaindomain.co.uk verwenden, erhalten Sie test oder, wenn Sie über mehrere Unterdomänenebenen http://another.test.mymaindomain.co.uk verfügen, another.test - es sei denn, Sie aktualisieren natürlich die DOMAIN.

Ich hoffe das hilft.

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

Ich weiß, ich bin wirklich spät dran, aber hier ist es.

Was ich tat, war die HTTP_Host-Servervariable ($_SERVER['HTTP_Host']) und die Anzahl der Buchstaben in der Domäne (also für example.com 11).

Dann habe ich die substr-Funktion verwendet, um die Subdomain zu erhalten. Ich tat

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

Ich schneide den Teilstring bei 12 anstelle von 11 ab, da Teilstrings für den zweiten Parameter bei 1 beginnen. Wenn Sie also test.example.com eingeben, lautet der Wert von $subdomaintest.

Dies ist besser als die Verwendung von explode, denn wenn die Subdomain einen . enthält, wird dies nicht abgeschnitten.

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

Wir verwenden diese Funktion, um mit multiple Subdomain und multiple tld auch mit ip und localhost zu arbeiten

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

sie können dies auch verwenden

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

Angenommen, die aktuelle URL = sub.example.com

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

 if (count ($ Host)> = 3) {
 echo "Hauptdomäne ist =". $ Host [1]. ".". $ Host [0]. "& subdomain ist =". $ Host [2]; 
 // Hauptdomäne ist = example.com & subdomain ist = sub 
 } else {
 echo "Hauptdomäne ist =". $ Host [1]. ".". $ Host [0]. "& Subdomain nicht gefunden"; 
 // "Hauptdomäne ist = example.com & Subdomain nicht gefunden"; 
 } 

Ich mache so etwas

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

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

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

Die Verwendung von regex, Stringfunktionen, parse_url () oder deren Kombinationen ist keine echte Lösung. Testen Sie einfach eine der vorgeschlagenen Lösungen mit der Domain test.en.example.co.uk. Es wird kein korrektes Ergebnis angezeigt.

Die richtige Lösung ist ein Paket, das die Domäne mit Public Suffix List analysiert. Ich empfehle TLDExtract , hier ist Beispielcode:

$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

wenn Sie Drupal verwenden 7 

das wird dir helfen:

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

In PHP 5.3 können Sie strstr () mit true parameter verwenden

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

Versuche dies...

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