Парсинг доменного имени с URL в PHP - PullRequest
3 голосов
/ 24 февраля 2010

Как я могу разобрать домен из 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.nic.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

Ответы [ 4 ]

2 голосов
/ 24 февраля 2010

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

РЕДАКТИРОВАТЬ: я считаю, что это возвращает весь домен.Чтобы получить домен верхнего уровня, вы можете сделать это:

// Add all your wanted subdomains that act as top-level domains, here (e.g. '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;
1 голос
/ 20 июня 2016

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

Вам нужен пакет, который использует Публичный список суффиксов , только таким образом вы сможете правильно извлечь домены с доменами верхнего уровня двух, третьего уровня (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'
1 голос
/ 24 февраля 2010

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

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

вы получите:

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

и т.д ...

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

так что для google.com.tr вы начнете с сопоставления tr, затем com, после чего не найдете совпадения, как только попадете в Google, что вам и нужно ...

1 голос
/ 24 февраля 2010

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

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

Будет эхом ...

Array
(
    [scheme] => http
    [host] => www.google.com
    [path] => /search
    [query] => hl=en&source=hp&q=google&btnG=Google+Search&meta=lr%3D&aq=&oq=dasd
)
...