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;
    }

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

Спасибо

5 ответов

Решение

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

$domain = substr($line, 0, strpos($line, "."));
$tld = substr($line, strpos($line, "."), (strlen($line) - strlen($domain)));

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

$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/>";

}

Второй метод: (спасибо хакре)

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

foreach ($domains as $d) {

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

}

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

Вот довольно гибкая функция, которая будет работать со всем, от example.com до http://username:password@example.com/public_html/test.zip до ftp://username@example.com до 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);
}

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

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

Другие вопросы по тегам