Парсинг домена с URL в PHP - PullRequest
       45

Парсинг домена с URL в PHP

118 голосов
/ 10 ноября 2008

Мне нужно создать функцию, которая анализирует домен по URL.

Итак, с

http://google.com/dhasjkdas/sadsdds/sdda/sdads.html

или

http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html

должно вернуть google.com

с

http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html

должно вернуть google.co.uk.

Ответы [ 19 ]

1 голос
/ 17 августа 2014

Я отредактировал для вас:

function getHost($Address) { 
    $parseUrl = parse_url(trim($Address));
    $host = trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2))); 

    $parts = explode( '.', $host );
    $num_parts = count($parts);

    if ($parts[0] == "www") {
        for ($i=1; $i < $num_parts; $i++) { 
            $h .= $parts[$i] . '.';
        }
    }else {
        for ($i=0; $i < $num_parts; $i++) { 
            $h .= $parts[$i] . '.';
        }
    }
    return substr($h,0,-1);
}

URL всех типов (www.domain.ltd, sub1.subn.domain.ltd приведет к: domain.ltd.

1 голос
/ 29 ноября 2012

parse_url не работает для меня. Это только вернуло путь. Переход к основам с использованием php5.3 +:

$url  = str_replace('http://', '', strtolower( $s->website));
if (strpos($url, '/'))  $url = strstr($url, '/', true);
1 голос
/ 31 декабря 2018

Пожалуйста, рассмотрите возможность замены принятого решения следующим:

parse_url () всегда будет включать любые поддомены, поэтому эта функция не очень хорошо разбирает доменные имена. Вот несколько примеров:

$url = 'http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
echo $parse['host']; // prints 'www.google.com'

echo parse_url('https://subdomain.example.com/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.com

echo parse_url('https://subdomain.example.co.uk/foo/bar', PHP_URL_HOST);
// Output: subdomain.example.co.uk

Вместо этого вы можете рассмотреть это прагматическое решение. Он будет охватывать многие, но не все доменные имена - например, домены более низкого уровня, такие как sos.state.oh.us, не охватываются.

function getDomain($url) {
    $domain_array = explode(".", str_replace('www.', '', parse_url($url,PHP_URL_HOST) ) );
    $count = count($domain_array);
    if( $count>=3 && strlen($domain_array[$count-2])==2 ) {
        // SLD (example.co.uk)
        return implode('.', array_splice($domain_array, $count-3,3) );
    } else if( $count>=2 ) {
        // TLD (example.com)
        return implode('.', array_splice($domain_array, $count-2,2) );
    }
}

// Your domains
    echo getDomain('http://google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
    echo getDomain('http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html'); // google.com
    echo getDomain('http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html'); // google.co.uk

// TLD
    echo getDomain('https://shop.example.com'); // example.com
    echo getDomain('https://foo.bar.example.com'); // example.com
    echo getDomain('https://www.example.com'); // example.com
    echo getDomain('https://example.com'); // example.com

// SLD
    echo getDomain('https://more.news.bbc.co.uk'); // bbc.co.uk
    echo getDomain('https://www.bbc.co.uk'); // bbc.co.uk
    echo getDomain('https://bbc.co.uk'); // bbc.co.uk

Наконец, PHP Domain Parser Джереми Кендалла позволяет вам анализировать доменное имя из URL. Анализатор имен URI лиги также выполнит эту работу.

1 голос
/ 09 сентября 2016

Я добавляю этот ответ поздно, так как этот ответ чаще всего появляется в Google ...

Вы можете использовать PHP для ...

$url = "www.google.co.uk";
$host = parse_url($url, PHP_URL_HOST);
// $host == "www.google.co.uk"

для захвата хоста , но не частного домена , на который ссылается хост. (Пример www.google.co.uk - хост, но google.co.uk - частный домен)

Чтобы получить приватный домен, вам необходимо знать список общедоступных суффиксов, к которым может зарегистрировать частный домен. Этот список куратор Mozilla на https://publicsuffix.org/

Приведенный ниже код работает, когда массив открытых суффиксов уже создан. Просто позвоните

$domain = get_private_domain("www.google.co.uk");

с оставшимся кодом ...

// find some way to parse the above list of public suffix
// then add them to a PHP array
$suffix = [... all valid public suffix ...];

function get_public_suffix($host) {
  $parts = split("\.", $host);
  while (count($parts) > 0) {
    if (is_public_suffix(join(".", $parts)))
      return join(".", $parts);

    array_shift($parts);
  }

  return false;
}

function is_public_suffix($host) {
  global $suffix;
  return isset($suffix[$host]);
}

function get_private_domain($host) {
  $public = get_public_suffix($host);
  $public_parts = split("\.", $public);
  $all_parts = split("\.", $host);

  $private = [];

  for ($x = 0; $x < count($public_parts); ++$x) 
    $private[] = array_pop($all_parts);

  if (count($all_parts) > 0)
    $private[] = array_pop($all_parts);

  return join(".", array_reverse($private));
}
0 голосов
/ 10 ноября 2008

Выезд parse_url ()

0 голосов
/ 10 апреля 2014

Как правило, это будет очень хорошо работать, если входной URL-адрес не является полным мусором. Удаляет поддомен.

$host = parse_url( $Row->url, PHP_URL_HOST );
$parts = explode( '.', $host );
$parts = array_reverse( $parts );
$domain = $parts[1].'.'.$parts[0];

Пример

Ввод: http://www2.website.com:8080/some/file/structure?some=parameters

Выход: website.com

0 голосов
/ 04 июня 2014

Вот мой сканер на основе приведенных выше ответов.

  1. Реализация класса (Мне нравится Obj:)
  2. он использует Curl, поэтому мы можем использовать http, требуется авторизация
  3. это только ссылка для сканирования, принадлежащая стартовому домену URL
  4. печатает код ответа заголовка http (полезно для проверки проблем на сайте)

КОД КРАСНОГО КЛАССА

class crawler
{
    protected $_url;
    protected $_depth;
    protected $_host;

    public function __construct($url, $depth = 5)
    {
        $this->_url = $url;
        $this->_depth = $depth;
        $parse = parse_url($url);
        $this->_host = $parse['host'];
    }

    public function run()
    {
        $this->crawl_page($this->_url, $this->_depth = 5);
    }

    public function crawl_page($url, $depth = 5)
    {
        static $seen = array();
        if (isset($seen[$url]) || $depth === 0) {
            return;
        }
        $seen[$url] = true;
        list($content, $httpcode) = $this->getContent($url);

        $dom = new DOMDocument('1.0');
        @$dom->loadHTML($content);
        $this->processAnchors($dom, $url, $depth);

        ob_end_flush();
        echo "CODE::$httpcode, URL::$url <br>";
        ob_start();
        flush();
        // echo "URL:", $url, PHP_EOL, "CONTENT:", PHP_EOL, $dom->saveHTML(), PHP_EOL, PHP_EOL;
    }

    public function processAnchors($dom, $url, $depth)
    {
        $anchors = $dom->getElementsByTagName('a');
        foreach ($anchors as $element) {
            $href = $element->getAttribute('href');
            if (0 !== strpos($href, 'http')) {
                $path = '/' . ltrim($href, '/');
                if (extension_loaded('http')) {
                    $href = http_build_url($url, array('path' => $path));
                } else {
                    $parts = parse_url($url);
                    $href = $parts['scheme'] . '://';
                    if (isset($parts['user']) && isset($parts['pass'])) {
                        $href .= $parts['user'] . ':' . $parts['pass'] . '@';
                    }
                    $href .= $parts['host'];
                    if (isset($parts['port'])) {
                        $href .= ':' . $parts['port'];
                    }
                    $href .= $path;
                }
            }
            // Crawl only link that belongs to the start domain
            if (strpos($href, $this->_host) !== false)
                $this->crawl_page($href, $depth - 1);
        }
    }

    public function getContent($url)
    {
        $handle = curl_init($url);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);

        /* Get the HTML or whatever is linked in $url. */
        $response = curl_exec($handle);

        /* Check for 404 (file not found). */
        $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
        if ($httpCode == 404) {
            /* Handle 404 here. */
        }

        curl_close($handle);
        return array($response, $httpCode);
    }
}

// USAGE
$startURL = 'http://YOUR_START_ULR';
$depth = 2;
$crawler = new crawler($startURL, $depth);
$crawler->run();
0 голосов
/ 13 июня 2016

Объединение ответов worldofjr и Alix Axel в одну небольшую функцию, которая будет обрабатывать большинство случаев использования:

function get_url_hostname($url) {

    $parse = parse_url($url);
    return str_ireplace('www.', '', $parse['host']);

}

get_url_hostname('http://www.google.com/example/path/file.html'); // google.com
0 голосов
/ 28 декабря 2014

Просто используйте как показано ниже ...

<?php
   echo $_SERVER['SERVER_NAME'];
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...