web-dev-qa-db-ja.com

PHP関数は、URLのサブドメインを取得します

サブドメインの名前を取得するPHPの関数はありますか?

次の例では、URLの「en」部分を取得します。

en.example.com
104
Damiano

これが1行のソリューションです。

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

または例を使用して:

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

EDIT:二重括弧を追加することにより、「変数のみを参照で渡す必要がある」を修正しました。


EDIT 2PHP 5.4 から開始すると、次のことが簡単にできます。

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

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

これを行うには、最初にドメイン名(例: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
32
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

ドメインサフィックスの唯一の信頼できるソースはドメインレジストラーであるため、サブドメインはその知識がないと見つけることができません。 https://publicsuffix.org にすべてのドメインサフィックスのリストがあります。このサイトは、PHPライブラリにもリンクしています: https://github.com/jeremykendall/php-domain-parser

以下の例をご覧ください。また、マルチサフィックス(co.uk)を持つドメインであるen.test.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
$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, '.')); 
4
Jared Farrish

単に...

    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
Kamafeather

最もシンプルで最速のソリューション。

$sSubDomain = str_replace('.example.com','',$_SERVER['HTTP_Host']);
4
user1416256

単に

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

1
Adam F

「エラー:厳格な標準:変数のみを参照渡しする必要があります。」次のように使用します。

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

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

前の質問で見たように: PHPで最初のサブドメインを取得する方法?

1
user3937344

これは私のソリューションであり、最も一般的なドメインで動作し、必要に応じて拡張機能の配列を適合させることができます:

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

1

正規表現、文字列関数、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'
1

私が見つけた最良かつ短い解決策は

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

100%動的なソリューションは実際にはありません-私もそれを把握しようとしており、異なるドメイン拡張機能(DTL)のために、このタスクは実際にこれらすべての拡張機能を解析して毎回チェックしなければ本当に難しいでしょう:

.com vs .co.uk vs org.uk

最も信頼できるオプションは、実際のドメイン名を格納する定数(またはデータベースエントリなど)を定義し、substr()を使用して$_SERVER['SERVER_NAME']から削除することです。

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がある場合は、another.testが得られます-もちろんDOMAINを更新します。

これがお役に立てば幸いです。

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

私は本当にゲームに遅れていることを知っていますが、ここに行きます。

HTTP_Hostサーバー変数($_SERVER['HTTP_Host'])とドメイン内の文字数(example.comの場合は11)を取得しました。

次に、substr関数を使用してサブドメインを取得しました。やった

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

サブストリングは2番目のパラメーターの1で始まるため、サブストリングを11ではなく12で切り取ります。したがって、test.example.comと入力すると、$subdomainの値はtestになります。

これはexplodeを使用するよりも優れています。サブドメインに.が含まれている場合、これが切り捨てられないためです。

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

この関数を使用して複数のサブドメイン複数のtldを処理し、ipと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

これも使えます

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

PHP 7.0:explode関数を使用して、すべての結果のリストを作成します。

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

例:sub.domain.com

echo $subdomain; 

結果:サブ

echo $Host;

結果:ドメイン

0
Jeacovy Gayle

現在のURL = sub.example.comと仮定します

 
 $ Host = array_reverse(explode( '。'、$ _SERVER ['SERVER_NAME'])); 
 
 if(count($ Host)> = 3){
 echo "メインドメインは="。$ Host [1]。 "。"。$ Host [0]。 "&サブドメインは="。$ Host [2]; 
 //メインドメインは= example.com&サブドメインは= sub 
} else {
 echo "メインドメインは="。$ Host [1]。 "。"。$ Host [0] 。 "&サブドメインが見つかりません"; 
 // "メインドメインは= example.com&サブドメインが見つかりません"; 
} 
 

私はこのようなことをしています

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

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

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

drupal 7を使用している場合

これはあなたを助けます:

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

PHP 5.3からstrstr()trueパラメーターとともに使用できます

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

これを試して...

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