Извлечение зарегистрированного домена из URL на основе Public Suffix List

Учитывая URL-адрес, как я могу извлечь зарегистрированный домен, используя список Public Suffix List (список эффективных 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.

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

Вы можете использовать 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 

UPDATE: эти библиотеки были перенесены на: https://github.com/leth/registered-domains-php

Этот вопрос немного устарел, но есть новое решение: 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" .

Я рекомендую использовать 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