복붙노트

URL의 하위 도메인을 가져 오는 PHP 함수

PHP

URL의 하위 도메인을 가져 오는 PHP 함수

PHP에서 하위 도메인의 이름을 가져 오는 함수가 있습니까?

다음 예제에서 URL의 "en"부분을 얻고 싶습니다.

en.example.com

해결법

  1. ==============================

    1.한 가지 해결책이 있습니다.

    한 가지 해결책이 있습니다.

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

    또는 예제를 사용하십시오.

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

    편집 : 고정 "유일한 변수는 참조로 전달되어야"이중 괄호를 추가하여.

    편집 2 : PHP 5.4부터 간단하게 할 수 있습니다 :

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

    2.parse_url 함수를 사용합니다.

    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);
    
  3. ==============================

    3.먼저 도메인 이름 (예 : sub.example.com => example.co.uk)을 가져온 다음 strstr을 사용하여 하위 도메인을 가져와이 작업을 수행 할 수 있습니다.

    먼저 도메인 이름 (예 : 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
    
  4. ==============================

    4.http://php.net/parse_url

    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'
    ?>
    
  5. ==============================

    5.도메인 접미사에 대한 유일한 신뢰할 수있는 소스는 도메인 등록 기관이므로 자신의 지식없이 하위 도메인을 찾을 수 없습니다. https://publicsuffix.org에는 모든 도메인 접미사 목록이 있습니다. 이 사이트는 또한 PHP 라이브러리 (https://github.com/jeremykendall/php-domain-parser)에 연결됩니다.

    도메인 접미사에 대한 유일한 신뢰할 수있는 소스는 도메인 등록 기관이므로 자신의 지식없이 하위 도메인을 찾을 수 없습니다. 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. ==============================

    6.가장 간단하고 빠른 솔루션.

    가장 간단하고 빠른 솔루션.

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

    7.

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

    8.

        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);
    }
    
  9. ==============================

    9.내가 가장 좋은 해결책을 찾았습니다.

    내가 가장 좋은 해결책을 찾았습니다.

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

    10.'오류 : 엄격한 표준 : 변수 만 참조로 전달해야합니다.' 다음과 같이 사용하십시오.

    '오류 : 엄격한 표준 : 변수 만 참조로 전달해야합니다.' 다음과 같이 사용하십시오.

    $ env = (폭발 ( ".", $ _ SERVER [ 'HTTP_HOST'])); $ env = array_shift ($ env);

  11. ==============================

    11.

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

    이전 질문에서 볼 수 있듯이 : PHP로 첫 번째 서브 도메인을 얻는 방법?

  12. ==============================

    12.실제로 100 % 동적 솔루션이 아닙니다. 저는 다른 도메인 확장 (DTL)으로 인해 이러한 문제를 실제로 파악하기는 어려웠습니다. 이러한 모든 확장을 실제로 구문 분석하고 매번 확인하지 않고서는이 작업을 수행하기가 정말 어려울 것입니다.

    실제로 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에서이 기능을 사용하고 있다면 테스트를 거치거나 http://another.test.mymaindomain.co.uk에 여러 하위 도메인 수준이있는 경우 another.test를 얻으십시오 - 물론 DOMAIN을 업데이트하지 않는 한.

    이게 도움이 되길 바란다.

  13. ==============================

    13.간단히

    간단히

    재설정 (폭발 ( ".", $ _SERVER [ 'HTTP_HOST']))

  14. ==============================

    14.이것은 내 솔루션이며, 가장 일반적인 도메인에서 작동하므로 필요한만큼 확장 배열에 맞출 수 있습니다.

    이것은 내 솔루션이며, 가장 일반적인 도메인에서 작동하므로 필요한만큼 확장 배열에 맞출 수 있습니다.

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

  15. ==============================

    15.

    // 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
    
  16. ==============================

    16.나는 게임에 정말로 늦었다는 것을 알고 있지만 여기에 간다.

    나는 게임에 정말로 늦었다는 것을 알고 있지만 여기에 간다.

    내가 한 일은 HTTP_HOST 서버 변수 ($ _SERVER [ 'HTTP_HOST'])와 도메인의 문자 수 (example.com의 경우 11 일 것입니다)입니다.

    그런 다음 substr 함수를 사용하여 하위 도메인을 가져 왔습니다. 나는했다.

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

    부분 문자열이 두 번째 매개 변수에 대해 1로 시작하기 때문에 11 대신 12에서 하위 문자열을 잘라 냈습니다. 이제 test.example.com을 입력하면 $ subdomain의 값이 test가됩니다.

    하위 도메인에.가있는 경우 explode를 사용하는 것보다 낫습니다. 그것 안에서, 이것은 그것을 끊어 버리지 않을 것입니다.

  17. ==============================

    17.drupal 7을 사용하는 경우

    drupal 7을 사용하는 경우

    이것은 당신을 도울 것입니다 :

    global $base_path;
    global $base_root;  
    $fulldomain = parse_url($base_root);    
    $splitdomain = explode(".", $fulldomain['host']);
    $subdomain = $splitdomain[0];
    
  18. ==============================

    18.

    $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 />';
    
  19. ==============================

    19.PHP 5.3에서 strstr ()을 true 매개 변수와 함께 사용할 수 있습니다.

    PHP 5.3에서 strstr ()을 true 매개 변수와 함께 사용할 수 있습니다.

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

    20.이 시도...

    이 시도...

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

    21.

    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);
    }
    
  22. ==============================

    22.regex, 문자열 함수, parse_url () 또는 그 조합을 사용하면 실제 솔루션이 아닙니다. 도메인 test.en.example.co.uk을 사용하여 제안 된 솔루션을 테스트하면 올바른 결과가 없습니다.

    regex, 문자열 함수, 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'
    
  23. ==============================

    23.너도 이걸 쓸 수있어.

    너도 이걸 쓸 수있어.

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

    24.나는 이렇게하고있다.

    나는 이렇게하고있다.

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

    25.PHP 7.0 : explode 함수를 사용하고 모든 결과 목록을 생성합니다.

    PHP 7.0 : explode 함수를 사용하고 모든 결과 목록을 생성합니다.

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

    예 : sub.domain.com

    echo $subdomain; 
    

    결과 : sub

    echo $host;
    

    결과 : 도메인

  26. ==============================

    26.이 함수를 사용하여 여러 하위 도메인과 여러 tld를 처리하고 ip 및 localhost도 처리합니다.

    이 함수를 사용하여 여러 하위 도메인과 여러 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;
        }
    
  27. ==============================

    27.첫 번째 기간 이전에만 원한다면

    첫 번째 기간 이전에만 원한다면

    list($sub) = explode('.', 'en.example.com', 2);
    
  28. from https://stackoverflow.com/questions/5292937/php-function-to-get-the-subdomain-of-a-url by cc-by-sa and MIT license