Учитывая 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