Разбор доменного имени из URL-адреса в PHP

Как я могу анализировать домен из URL в PHP? Кажется, мне нужна база данных домена страны.

Примеры:

http://mail.google.com/hfjdhfjd/jhfjd.html -> google.com
http://www.google.bg/jhdjhf/djfhj.html -> google.bg
http://www.google.co.uk/djhdjhf.php -> google.co.uk
http://www.tsk.tr/jhjgc.aspx -> tsk.tr
http://subsub.sub.nic.tr/ -> nic.tr
http://subsub.sub.google.com.tr -> google.com.tr
http://subsub.sub.itoy.info.tr -> itoy.info.tr

Можно ли это сделать с просьбой whois?

Изменить: Есть несколько доменных имен с .tr ( www.tsk.tr , www.tsk.tr ), остальные, как вы знаете: www.something.com.tr , www.something.org.tr

Также нет www.something.com.bg , www.something.org.bg . Это www.something.bg как у немцев .de

Но есть www.something.a.bg , www.something.b.bg таким образом, a.bg , b.bg , c.bg и т. Д. ( a.bg подобен co.uk )

Там в сети должен быть список этих главных доменных имен.

Проверьте, как окрашен URL-адрес http://www.agrotehnika97.a.bg/ в Internet Explorer. Проверьте также

 www.google.co.uk<br> www.google.com.tr<br> www.nic.tr<br> www.tsk.tr 

Домен хранится в $_SERVER['HTTP_HOST'] .

EDIT: Я считаю, что это возвращает весь домен. Чтобы получить домен верхнего уровня, вы можете сделать это:

 // Add all your wanted subdomains that act as top-level domains, here (eg 'co.cc' or 'co.uk') // As array key, use the last part ('cc' and 'uk' in the above examples) and the first part as sub-array elements for that key $allowed_subdomains = array( 'cc' => array( 'co' ), 'uk' => array( 'co' ) ); $domain = $_SERVER['HTTP_HOST']; $parts = explode('.', $domain); $top_level = array_pop($parts); // Take care of allowed subdomains if (isset($allowed_subdomains[$top_level])) { if (in_array(end($parts), $allowed_subdomains[$top_level])) $top_level = array_pop($parts).'.'.$top_level; } $top_level = array_pop($parts).'.'.$top_level; 

Вы можете использовать parse_url() чтобы разделить его и получить то, что вы хотите. Вот пример …

     $ url = 'http://www.google.com/search?hl=ru&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd';
     print_r (parse_url ($ URL));

Будет эхо …

 массив
 (
     [схема] => http
     [host] => www.google.com
     [path] => / search
     [query] => hl = en & source = hp & q = google & btnG = Google + Поиск & meta = lr% 3D & aq = & oq = dasd
 ) 

Я полагаю, вам понадобится список всех суффиксов, используемых после имени домена. http://publicsuffix.org/list/ предоставляет обновленные (или, как они утверждают, требования) все суффиксы, используемые в настоящее время. Список на самом деле здесь. Теперь идея состоит в том, чтобы вы проанализировали этот список в структуре с разными уровнями, разделенными точкой, начиная с конечных уровней:

например, для доменов: com.la com.tr com.lc

вы получите:

 [la]=>[com] [lc]=>[com] 

и т.д…

Затем вы получите хост от base_url (используя parse_url), и вы взорвите его точками. и вы начинаете сопоставлять значения с вашей структурой, начиная с последней:

поэтому для google.com.tr вы начнете с сопоставления tr, затем ком, тогда вы не найдете совпадения, как только вы доберетесь до google, и это то, что вы хотите …

Regex и parse_url () не являются решением для вас.

Вам нужен пакет, в котором используется Public Suffix List , только таким образом вы можете корректно извлекать домены с двумя доменами третьего уровня (co.uk, a.bg, b.bg и т. Д.). Я рекомендую использовать TLD Extract .

Вот пример кода:

 $extract = new LayerShifter\TLDExtract\Extract(); $result = $extract->parse('http://subsub.sub.google.com.tr'); $result->getRegistrableDomain(); // will return (string) 'google.com.tr'