PHP Поиск имени домена и расширения домена из массива

У меня есть массив данных, содержащий несколько доменов с расширениями TLD. Я хочу собрать доменное имя и расширение TLD отдельно.

Например. Из «hello.com» я хочу собрать «hello» как одну переменную, а затем собрать «.com» как другую переменную.

Другой например. ВАЖНО, из "hello.co.uk" я хочу собрать "hello" как одну переменную, а затем собрать ".co.uk" как другую переменную.

Мой текущий код, использующий pathinfo(), будет корректно работать на «hello.com», но не на «hello.co.uk». Для «hello.co.uk» он будет собирать «hello.co» как одну переменную, а затем собирать «.uk» как другую переменную.

Вот код, который я использую:

// Get a file into an array
$lines = file($_FILES['file']['tmp_name']);

// Loop through array
foreach ($lines as $line_num => $line) {
    echo $line;

    //Find TLD
    $tld = ".".pathinfo($line, PATHINFO_EXTENSION);
    echo $tld;

    //Find Domain
    $domain = pathinfo($line, PATHINFO_FILENAME);
    echo $domain;
    }

Надеюсь, я объяснил это достаточно хорошо. Я часто использую stackoverflow, но не смог найти конкретного примера этого.

Спасибо


person Ryan M    schedule 08.01.2013    source источник
comment
list($domain, $tld) = explode('.', $line, 2);   -  person hakre    schedule 08.01.2013
comment
Что вы хотите получить за subdomain.hello.co.uk? Ответы, данные до сих пор, дадут домен = subdomain, расширение = hello.co.uk.   -  person Barmar    schedule 08.01.2013
comment
@Barmar: для этих случаев есть data.iana.org/TLD/ tlds-alpha-by-domain.txt — что показывает, что OP уже ищет субдомен с самой левой стороны. - для остальных нужд есть publicsuffix.org   -  person hakre    schedule 08.01.2013


Ответы (5)


Вместо использования функций, предназначенных для файлов, вы можете просто использовать некоторые простые манипуляции со строками:

$domain = substr($line, 0, strpos($line, "."));
$tld = substr($line, strpos($line, "."), (strlen($line) - strlen($domain)));
person Taz    schedule 08.01.2013
comment
Отредактировал strpos на strstr, потому что сомневался в себе, а потом понял, что был прав в первый раз... Урок: никогда не сомневайся в себе. - person Taz; 08.01.2013

Первый метод:

$domains = array("hello.co.uk", "hello.com");

foreach ($domains as $d) {

    $ext = strstr($d, '.'); // extension
    $index = strpos($d, '.');

    $arr = str_split($d, $index);

    $domain = $arr[0]; // domain name


    echo "domain: $domain, extension: $ext <br/>";

}

Второй способ: (спасибо hakre)

$domains = array("hello.co.uk", "hello.com");

foreach ($domains as $d) {

    list($domain, $ext) = explode('.', $d, 2);
    echo "domain: $domain, extension: $ext <br/>";

}
person mynewaccount    schedule 08.01.2013

Вот довольно гибкая функция, которая будет работать со всем, от example.com до http://username:[email protected]/public_html/test.zip на ftp://[email protected] на http://www.reddit.com/r/aww/comments/165v9u/shes_allergic_couldnt_help_herself/

function splitDomain($url) { 
 $host = "";
 $url = parse_url($url);
 if(isset($url['host'])) { 
    $host = $url['host'];
 } else {
    $host = $url['path'];
 }
 $host = str_replace('www.','',$host);
 $tmp = explode('.', $host);
 $name = $tmp[0];
 $tld = $tmp[1];
return array('name'=>$name,'tld'=>$tld);
}
person Josh Brody    schedule 08.01.2013
comment
Хороший ответ! :) +1 (PS. Я парень отсюда stackoverflow. ком/вопросы/14087116/) - person ; 08.01.2013

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

Популярной является таблица, известная как Список общедоступных суффиксов.

person Alnitak    schedule 08.01.2013

Для работы с двухуровневыми (co.uk) и трехуровневыми TLD (act.edu.au) вам потребуется библиотека, использующая Public Suffix List (список доменов верхнего уровня), я рекомендую использовать TLDExtract.

person Oleksandr Fediashov    schedule 20.06.2016