PHP получить домен из URL

0

Я смотрел онлайн (и здесь также) для всех возможных функций для получения домена из URL. Последний код, который я нашел, отсюда - https://gist.github.com/pocesar/5366899

            <?php
            /**
             * @param string $domain Pass $_SERVER['SERVER_NAME'] here
             * @param bool $debug
             *
             * @debug bool $debug
             * @return string
             */
            function get_domain($domain, $debug = false)
            {
                $original = $domain = strtolower($domain);

                if (filter_var($domain, FILTER_VALIDATE_IP)) { return $domain; }

                $debug ? print('<strong style="color:green">&raquo;</strong> Parsing: '.$original) : false;

                $arr = array_slice(array_filter(explode('.', $domain, 4), function($value){
                    return $value !== 'www';
                }), 0); //rebuild array indexes

                if (count($arr) > 2)
                {
                    $count = count($arr);
                    $_sub = explode('.', $count === 4 ? $arr[3] : $arr[2]);

                    $debug ? print(" (parts count: {$count})") : false;

                    if (count($_sub) === 2) // two level TLD
                    {
                        $removed = array_shift($arr);
                        if ($count === 4) // got a subdomain acting as a domain
                        {
                            $removed = array_shift($arr);
                        }
                        $debug ? print("<br>\n" . '[*] Two level TLD: <strong>' . join('.', $_sub) . '</strong> ') : false;
                    }
                    elseif (count($_sub) === 1) // one level TLD
                    {
                        $removed = array_shift($arr); //remove the subdomain

                        if (strlen($_sub[0]) === 2 && $count === 3) // TLD domain must be 2 letters
                        {
                            array_unshift($arr, $removed);
                        }
                        else
                        {
                            // non country TLD according to IANA
                            $tlds = array(
                                'aero',
                                'arpa',
                                'asia',
                                'biz',
                                'cat',
                                'com',
                                'coop',
                                'edu',
                                'gov',
                                'info',
                                'jobs',
                                'mil',
                                'mobi',
                                'museum',
                                'name',
                                'net',
                                'org',
                                'post',
                                'pro',
                                'tel',
                                'travel',
                                'xxx',
                            );

                            if (count($arr) > 2 && in_array($_sub[0], $tlds) !== false) //special TLD don't have a country
                            {
                                array_shift($arr);
                            }
                        }
                        $debug ? print("<br>\n" .'[*] One level TLD: <strong>'.join('.', $_sub).'</strong> ') : false;
                    }
                    else // more than 3 levels, something is wrong
                    {
                        for ($i = count($_sub); $i > 1; $i--)
                        {
                            $removed = array_shift($arr);
                        }
                        $debug ? print("<br>\n" . '[*] Three level TLD: <strong>' . join('.', $_sub) . '</strong> ') : false;
                    }
                }
                elseif (count($arr) === 2)
                {
                    $arr0 = array_shift($arr);

                    if (strpos(join('.', $arr), '.') === false
                        && in_array($arr[0], array('localhost','test','invalid')) === false) // not a reserved domain
                    {
                        $debug ? print("<br>\n" .'Seems invalid domain: <strong>'.join('.', $arr).'</strong> re-adding: <strong>'.$arr0.'</strong> ') : false;
                        // seems invalid domain, restore it
                        array_unshift($arr, $arr0);
                    }
                }

                $debug ? print("<br>\n".'<strong style="color:gray">&laquo;</strong> Done parsing: <span style="color:red">' . $original . '</span> as <span style="color:blue">'. join('.', $arr) ."</span><br>\n") : false;

                return join('.', $arr);
            }

            $urls = array(
                'www.example.com' => 'example.com',
                'example.com' => 'example.com',
                'example.com.br' => 'example.com.br',
                'www.example.com.br' => 'example.com.br',
                'www.example.gov.br' => 'example.gov.br',
                'localhost' => 'localhost',
                'www.localhost' => 'localhost',
                'subdomain.localhost' => 'localhost',
                'www.subdomain.example.com' => 'example.com',
                'subdomain.example.com' => 'example.com',
                'subdomain.example.com.br' => 'example.com.br',
                'www.subdomain.example.com.br' => 'example.com.br',
                'www.subdomain.example.biz.br' => 'example.biz.br',
                'subdomain.example.biz.br' => 'example.biz.br',
                'subdomain.example.net' => 'example.net',
                'www.subdomain.example.net' => 'example.net',
                'www.subdomain.example.co.kr' => 'example.co.kr',
                'subdomain.example.co.kr' => 'example.co.kr',
                'example.co.kr' => 'example.co.kr',
                'example.jobs' => 'example.jobs',
                'www.example.jobs' => 'example.jobs',
                'subdomain.example.jobs' => 'example.jobs',
                'insane.subdomain.example.jobs' => 'example.jobs',
                'insane.subdomain.example.com.br' => 'example.com.br',
                'www.doubleinsane.subdomain.example.com.br' => 'example.com.br',
                'www.subdomain.example.jobs' => 'example.jobs',
                'test' => 'test',
                'www.test' => 'test',
                'subdomain.test' => 'test',
                'www.detran.sp.gov.br' => 'sp.gov.br',
                'www.mp.sp.gov.br' => 'sp.gov.br',
                'ny.library.museum' => 'library.museum',
                'www.ny.library.museum' => 'library.museum',
                'ny.ny.library.museum' => 'library.museum',
                'www.library.museum' => 'library.museum',
                'info.abril.com.br' => 'abril.com.br',
                '127.0.0.1' => '127.0.0.1',
                '::1' => '::1',
            );

            $failed = 0;
            $total = count($urls);

            foreach ($urls as $from => $expected)
            {
                $from = get_domain($from, true);
                if ($from !== $expected)
                {
                    $failed++;
                    print("<div style='color:fuchsia;'>expected {$from} to be {$expected}</div>");
                }
            }

            if ($failed)
            {
                print("{$failed} tests failed out of {$total}");
            }
            else
            {
                print("Success");
            }

Но я обнаружил, что в этих случаях это не работает:

blog.ebaum.tv
api.outside.in
chip.cuccio.us
brushes.net.tc
beta.wua.la
core.windows.net
dd.cron.ru
compute-1.amazonaws.com
docs.rinet.ru
dupont.free.fr
edusim.greenbush.us
dtek.chalmers.se
fifthgear.five.tv
friizu.pri.ee
fortune.cnn.com
grondziowski.neostrada.pl
iden.tify.us
fb.joyent.us
blog.tr.im
jspec.jaxa.jp
mashable.blogs.mu
lists.burri.to
com.edgesuite.net
my.noovo.us
blog.bit.ly
moon.dominos.jp

Таким образом, для всех поддоменов выше функция возвращает субдомен вместо домена. Кто-нибудь знает, как исправить эту функцию?

  • 0
    Функция всегда возвращает домен третьего уровня в определенных для страны доменах верхнего уровня. Предполагается, что все они имеют форму organization.type.country , например, oxford.ac.uk и example.co.cr .
  • 0
    @Barmar Бармар, у тебя есть идеи, как это исправить? Также "compute-1.amazonaws.com" является некоторой ошибкой. Также «dupont.free.fr» должен быть «free.fr» и т. Д.
Показать ещё 1 комментарий
Теги:
dns
url

2 ответа

1
Лучший ответ

Пытаться:

function getDomain ($address) {

# Establishes Hostname
$uri[Hostname] = substr($address,0, (strpos($address,'.')));

# Establishes Domainname
$uri[Domainname] = substr($address, (strlen($uri[Hostname]) + 1));

if (preg_match("/\//", $uri[Domainname])) {
$uri[Domainname] = substr($uri[Domainname], 0, strpos($uri[Domainname],'/'));
}

# Establishes TLD
if (preg_match("/\./", $uri[Domainname])) {
$uri[TLD] = substr($uri[Domainname], (strpos($uri[Domainname],'.') + 1));
$uri[Domainname] = substr($uri[Domainname],0,-(strlen($uri[TLD]) + 1));
}

if (preg_match("/\//", $uri[TLD])) {
$uri[TLD] = substr($uri[TLD], 0, strpos($uri[TLD],'/'));
}

# Re-labels parts if there are only 2 (instead of 3)
if (count($uri) == 2) {
$uri[TLD] = $uri[Domainname];
$uri[Domainname] = $uri[Hostname];
unset ($uri[Hostname]);
}

# Added to handle domains of type .co.rs, .co.uk, .co.jp etc.
if ($uri[Domainname] == 'co') {
$uri[TLD] = $uri[Domainname].'.'.$uri[TLD];
$uri[Domainname] = $uri[Hostname];
unset ($uri[Hostname]);
}

return $uri;
}

Эта функция будет принимать любой стандартный веб-адрес (т.е. Не один, включая несколько поддоменов), и возвращать массив, содержащий имя хоста (необязательно), имя домена и TLD.

  • 0
    Если вам также нужно обрабатывать веб-адреса, которые включают несколько поддоменов, вы можете превратить блок, содержащий 2-й и 3-й операторы if в цикл, чтобы извлечь каждый поддомен из веб-адреса.
  • 0
    Не работает. Для домена "slajer.co.rs" возвращается "Массив ([Имя хоста] => slajer [Доменное имя] => co [TLD] => rs)". Но .co.rs это TLD
Показать ещё 1 комментарий
0

Вы можете легко найти доменное имя, используя простую функцию сервера, как показано ниже...

     echo $_SERVER['SERVER_NAME'];

ИЛИ

Сначала вы можете создать функцию, как показано ниже.

<?php

  function getDomain($url){
    if(filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED) === FALSE){
       return false;
     }

     /*** to get the url parts ***/
     $parts = parse_url($url);

     /*** return the host domain ***/
     return $parts['scheme'].'://'.$parts['host'];

   }
?>

Затем вызовите эту функцию, как показано ниже....

<?php

  $url = 'http://phpro.org/classes/Phproogle-Docs.html';
  echo getDomain($url);
?>
  • 0
    Это определенно полезная глобальная переменная, которую нужно знать. Но ... он не извлечет домен из URI.
  • 0
    Теперь, надеюсь, он вернет точный домен .... Если не работает, просто отправьте ожидаемый формат домена в качестве примера ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню