Удалить расширение домена

Итак, допустим, у меня есть just-a.domain.com,just-a-domain.info,just.a-domain.net Как я могу удалить расширение .com,.net.info ... и мне нужны результаты в две переменные, одна с доменным именем, другая – с расширением.

Я пытался с str_replace но не работает, думаю, только с регулярным выражением ….

Related of "Удалить расширение домена"

 $subject = 'just-a.domain.com'; $result = preg_split('/(?=\.[^.]+$)/', $subject); 

Это создает следующий массив

 $result[0] == 'just-a.domain'; $result[1] == '.com'; 
  preg_match('/(.*?)((?:\.co)?.[az]{2,4})$/i', $domain, $matches); 

$ matches [1] будет иметь домен, а $ matches [2] будет иметь расширение

 <?php $domains = array("google.com", "google.in", "google.co.in", "google.info", "analytics.google.com"); foreach($domains as $domain){ preg_match('/(.*?)((?:\.co)?.[az]{2,4})$/i', $domain, $matches); print_r($matches); } ?> 

Будет производить выход

 Array ( [0] => google.com [1] => google [2] => .com ) Array ( [0] => google.in [1] => google [2] => .in ) Array ( [0] => google.co.in [1] => google [2] => .co.in ) Array ( [0] => google.info [1] => google [2] => .info ) Array ( [0] => analytics.google.com [1] => analytics.google [2] => .com ) 

Если вы хотите удалить часть домена, администрируемую регистраторами доменных имен, вам нужно будет использовать список таких суффиксов, как Public Suffix List .

Но так как прогулка по этому списку и проверка суффикса на доменное имя не так эффективны, скорее используйте этот список только для создания индекса следующим образом:

 $tlds = array( // ac : http://en.wikipedia.org/wiki/.ac 'ac', 'com.ac', 'edu.ac', 'gov.ac', 'net.ac', 'mil.ac', 'org.ac', // ad : http://en.wikipedia.org/wiki/.ad 'ad', 'nom.ad', // … ); $tldIndex = array_flip($tlds); 

Поиск лучшего совпадения будет следующим:

 $levels = explode('.', $domain); for ($length=1, $n=count($levels); $length<=$n; ++$length) { $suffix = implode('.', array_slice($levels, -$length)); if (!isset($tldIndex[$suffix])) { $length--; break; } } $suffix = implode('.', array_slice($levels, -$length)); $prefix = substr($domain, 0, -strlen($suffix) - 1); 

Или создайте дерево, представляющее иерархию уровней доменных имен, следующим образом:

 $tldTree = array( // ac : http://en.wikipedia.org/wiki/.ac 'ac' => array( 'com' => true, 'edu' => true, 'gov' => true, 'net' => true, 'mil' => true, 'org' => true, ), // ad : http://en.wikipedia.org/wiki/.ad 'ad' => array( 'nom' => true, ), // … ); 

Затем вы можете использовать следующее, чтобы найти совпадение:

 $levels = explode('.', $domain); $r = &$tldTree; $length = 0; foreach (array_reverse($levels) as $level) { if (isset($r[$level])) { $r = &$r[$level]; $length++; } else { break; } } $suffix = implode('.', array_slice($levels, - $length)); $prefix = substr($domain, 0, -strlen($suffix) - 1); 

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

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

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

 $extract = new LayerShifter\TLDExtract\Extract(); $result = $extract->parse('just.a-domain.net'); $result->getSubdomain(); // will return (string) 'just' $result->getHostname(); // will return (string) 'a-domain' $result->getSuffix(); // will return (string) 'net' $result->getRegistrableDomain(); // will return (string) 'a-domain.net' 
 strrpos($str, ".") 

Дает вам индекс за последний период в вашей строке, затем вы можете использовать substr() с индексом и вернуть короткую строку.