Intereting Posts
Повторяющиеся ключи для ассоциативных массивов PHP Mod_rewrite – создание чистых URL-адресов Невозможно получить объект категории в некоторых шаблонах WooCommerce Более динамичная страница с sitecake? Безопасное обнаружение ошибки «Разрешенная память» DateTime :: CreateFromFormat для PHP 5.2.14 php-скрипт анализирует контент из RTE (tt_news), но внутренние ссылки не отображаются как говорящий URL-адрес Laravel: Где выбор для Eloquent Eager Загрузка отношений Остановка сообщений пользователей более одного раза PHP Выбрать с помощью PDO Вызов функции-члена prepare () при ошибке, отличной от объекта Как связать входящий звонок Twilio с пользовательским идентификатором? отображение нескольких шаблонов в одном файле Smarty Smart Поиск по дням из датпикера Получение PEAR для работы в XAMPP (стек Apache / MySQL в Windows) PHP избегает статических классов, чтобы избежать зависимостей, но мне нужно использовать глобальные везде

Получить корневую запись DNS с сервера php; получить доменное имя без www, ect

Как получить корневую запись DNS из $_SERVER['HTTP_HOST'] ?

Входные данные:

 example.co.uk www.example.com blog.example.com forum.example.co.uk 

Вывод:

 example.co.uk example.com example.com example.co.uk 

EDIT: список поиска очень длинный

    Для этого проекта: http://drupal.org/project/parallel

    Применение:

     echo parallel_get_domain("www.robknight.org.uk") . "<br>"; echo parallel_get_domain("www.google.com") . "<br>"; echo parallel_get_domain("www.yahoo.com") . "<br>"; 

    Функции:

     /** * Given host name returns top domain. * * @param $host * String containing the host name: www.example.com * * @return string * top domain: example.com */ function parallel_get_domain($host) { if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && strnatcmp(phpversion(),'5.3.0') < 0) { // This works 1/2 the time... CNAME doesn't work with nslookup for ($end_pieces = substr_count($host, '.'); $end_pieces > 0; $end_pieces--) { $test_domain = end(explode('.', $host, $end_pieces)); if (checkdnsrr($test_domain)) { $domain = $test_domain; break; } } return isset($domain) ? $domain : FALSE; } else { // This always works $sections = explode('.', $host); array_unshift($sections, ''); foreach($sections as $key => $value) { $parts[$key] = $value; $test_domain = implode('.', parallel_array_xor($parts, $sections)); if (checkdnsrr($test_domain, 'NS') && !checkdnsrr($test_domain, 'CNAME')) { $domain = $test_domain; break; } } return isset($domain) ? $domain : FALSE; } } /** * Opposite of array_intersect(). * * @param $array_a * First array * @param $array_b * Second array * * @return array */ function parallel_array_xor ($array_a, $array_b) { $union_array = array_merge($array_a, $array_b); $intersect_array = array_intersect($array_a, $array_b); return array_diff($union_array, $intersect_array); } /** * Win compatible version of checkdnsrr. * * checkdnsrr() support for Windows by HM2K <php [spat] hm2k.org> * http://us2.php.net/manual/en/function.checkdnsrr.php#88301 * * @param $host * String containing host name * @param $type * String containing the DNS record type * * @return bool */ function parallel_win_checkdnsrr($host, $type='MX') { if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') { return FALSE; } if (empty($host)) { return FALSE; } $types=array('A', 'MX', 'NS', 'SOA', 'PTR', 'CNAME', 'AAAA', 'A6', 'SRV', 'NAPTR', 'TXT', 'ANY'); if (!in_array($type, $types)) { user_error("checkdnsrr() Type '$type' not supported", E_USER_WARNING); return FALSE; } @exec('nslookup -type=' . $type . ' ' . escapeshellcmd($host), $output); foreach($output as $line){ if (preg_match('/^' . $host . '/', $line)) { return TRUE; } } } // Define checkdnsrr() if it doesn't exist if (!function_exists('checkdnsrr')) { function checkdnsrr($host, $type='MX') { return parallel_win_checkdnsrr($host, $type); } } 

    Выход – Windows:

     org.uk google.com yahoo.com 

    Выход – Linux:

     robknight.org.uk google.com yahoo.com 

    Я думаю, что это немного некорректно.

    Вы можете попробовать выполнить поиск DNS для каждой родительской записи, пока не найдете тот, который не возвращает запись A.

     /[^\.]+\.[escaped|list|of|domains]$/ 

    Я думаю, что это должно сработать.

    Как вы обнаружили, некоторые страны используют только TLD (пример: .tv, .us), другие подразделяют их TLD страны (пример: uk).

    В идеале вам понадобится список поиска (он будет недолгим) одобренных TLD и, если он будет разделен, TLD с каждым подразделением (например, «.co.uk» вместо «.uk»). Это скажет вам, какие «точки» (справа) сохранить. Затем переместите одну точку слева от нее (если она найдена) и нарежьте все до нее.

    Без списка поиска вы можете использовать тот факт, что подразделения (.co и т. Д.) Предназначены только для стран (имеющих 2-буквенные TLD) и AFAIK не более 3-х символов и всегда являются буквами, поэтому вы можете, вероятно, распознать их с помощью шаблона регулярного выражения.

    Изменить: Nevermind, фактический список открытых суффиксов намного сложнее. Вам нужно будет использовать таблицу поиска, чтобы выяснить, что такое суффикс, вернуться к предыдущей точке и обрезать влево. RegEx – это плохое решение. Вместо этого сохраните список суффиксов в словаре, а затем протестируйте свое доменное имя, вырывая одну пунктирную часть за раз слева, пока не нажмете совпадение, а затем добавьте обратно часть, которую вы только что сбили.

    Примечание: как указано в комментариях, этот метод фактически не работает во всех случаях. Причина этого в том, что некоторые домены верхнего уровня разрешают IP-адреса, даже если большинство из них этого не делают. Поэтому невозможно определить, является ли данное имя доменным именем верхнего уровня или псевдо-верхнего уровня, просто проверяя, имеет ли он IP-адрес. К сожалению, это, вероятно, означает, что единственным решением является список поиска, учитывая, как на практике несовременно обрабатываются домены верхнего уровня.

    Повторяю: не полагайтесь на приведенный ниже код, чтобы работать на вас. Я оставляю его здесь только для образовательных целей.

    Существует способ сделать это без списка поиска. Список может быть ненадежным или неполным, тогда как этот метод гарантированно работает:

     <?php function get_domain($url) { $dots = substr_count($url, '.'); $domain = ''; for ($end_pieces = $dots; $end_pieces > 0; $end_pieces--) { $test_domain = end(explode('.', $url, $end_pieces)); if (dns_check_record($test_domain, 'A')) { $domain = $test_domain; break; } } return $domain; } $my_domain = get_domain('www.robknight.org.uk'); echo $my_domain; ?> 

    В этом случае он выведет «robknight.org.uk». Он будет работать одинаково хорошо для .com, .edu, .com.au, .ly или любого другого домена верхнего уровня, над которым вы работаете.

    Он работает, начиная с права и делая проверку DNS на первое, что похоже, что это может быть жизнеспособным доменным именем. В приведенном выше примере он начинается с «org.uk», но обнаруживает, что это не фактическое доменное имя, а является ccTLD. Затем он переходит к проверке «robknight.org.uk», который действителен и возвращает это. Если доменное имя было, скажем, «www.php.net», оно начиналось с проверки «php.net», который является допустимым доменным именем, и немедленно вернул бы его без цикла. Я также должен указать, что если действительное доменное имя не найдено, будет возвращена пустая строка ('').

    Этот код может быть неподходящим для обработки большого количества доменных имен за короткий промежуток времени из-за времени, затраченного на поиск DNS, но он отлично подходит для одиночного поиска или кода, который не критичен по времени.