Извлечение зарегистрированного домена из URL на основе публичного списка суффиксов - PullRequest
9 голосов
/ 25 ноября 2011

Учитывая URL, как мне извлечь зарегистрированный домен, используя Публичный список суффиксов (список действующих TLD, например, этот список )?

Например, учитывая, что a.bg является действительным общедоступным суффиксом:

http://www.test.start.a.bg/hello.html -> start.a.bg 
http://test.start.a.bg/               -> start.a.bg
http://test.start.abc.bg/             -> abc.bg (.bg is the public suffix)

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

P.S. Неважно, как я читаю список (база данных или простой файл), но список должен быть доступен локально, поэтому я не всегда зависим от внешних служб.

Ответы [ 3 ]

16 голосов
/ 25 ноября 2011

Вы можете использовать parse_url() для извлечения имени хоста, а затем использовать библиотеку , предоставленную regdom , для определения зарегистрированного доменного имени (dn + eTLD).Например:

require_once("effectiveTLDs.inc.php");
require_once("regDomain.inc.php");

$url =  'http://www.metu.edu.tr/dhasjkdas/sadsdds/sdda/sdads.html';
echo getRegisteredDomain(parse_url($url, PHP_URL_HOST));

Будет напечатано metu.edu.tr.

Другие примеры, которые я пробовал:

http://www.xyz.start.bg/hello   ->   start.bg
http://www.start.a.bg/world     ->   start.a.bg  (a.bg is a listed eTLD)
http://xyz.ma219.metu.edu.tr    ->   metu.edu.tr
http://www.google.com/search    ->   google.com
http://google.co.uk/search?asd  ->   google.co.uk

ОБНОВЛЕНИЕ: Эти библиотеки были перемещены в: https://github.com/leth/registered-domains-php

4 голосов
/ 07 апреля 2015

Этот вопрос немного устарел, но есть новое решение: https://github.com/jeremykendall/php-domain-parser

Эта библиотека делает именно то, что вы хотите. Вот настройки:

$pslManager = new Pdp\PublicSuffixListManager();
$parser = new Pdp\Parser($pslManager->getList());
echo $parser->getRegisterableDomain('www.scottwills.co.uk');

Будет напечатано "scottwills.co.uk".

1 голос
/ 20 июня 2016

Я рекомендую использовать TLDExtract , у него есть регулярно обновляемая база данных, сгенерированная из PSL .

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('shop.github.com');
$result->getFullHost(); // will return (string) 'shop.github.com'
$result->getRegistrableDomain(); // will return (string) 'github.com'
$result->isValidDomain(); // will return (bool) true
$result->isIp(); // will return (bool) false
...