2010-10-04 15 views
6

Załóżmy, że mam just-a.domain.com,just-a-domain.info,just.a-domain.net, jak mogę usunąć rozszerzenie .com,.net.info ... i potrzebuję wyników w dwóch zmiennych jeden z nazwą domeny, a drugi z rozszerzeniem.Usuń rozszerzenie domeny

Próbowałem z str_replace, ale nie działa, chyba tylko z regex ....

+5

Jakie części powinny www.google.co.uk powrócić? – Matthew

Odpowiedz

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

ta wywołuje następujące tablicę

$result[0] == 'just-a.domain'; 
$result[1] == '.com'; 
+0

działa, ale tylko dla domen z jednym DOT w rozszerzeniu. Na przykład. dla ".com.br" to nie zadziała. – almo

+0

@almo Uzyskaj wynik za pomocą skryptu, a następnie ponownie podziel wynik :) –

-1
strrpos($str, ".") 

daje indeks ostatniego okresu w ciągu, a następnie można użyć substr() z indeksu i zwróć krótki ciąg.

+0

to nie działa dla .co.uk .com.br itp. –

10
preg_match('/(.*?)((?:\.co)?.[a-z]{2,4})$/i', $domain, $matches); 

$ matches [1] będzie mieć domenę i $ matches [2] będzie miał rozszerzenie

<?php 

$domains = array("google.com", "google.in", "google.co.in", "google.info", "analytics.google.com"); 

foreach($domains as $domain){ 
    preg_match('/(.*?)((?:\.co)?.[a-z]{2,4})$/i', $domain, $matches); 
    print_r($matches); 
} 
?> 

będzie produkować wyjście

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 
) 
7

Jeśli chcesz usunąć część domeny administrowanej przez rejestratorów nazw domen, musisz użyć listy takich sufiksów, jak the Public Suffix List.

Ale ponieważ spacer po tej liście i testowanie przyrostek w nazwie domeny nie jest tak skuteczny, a korzystać z tej listy tylko do budowania indeksu takiego:

$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); 

poszukiwaniu najlepszych meczu będzie wtedy iść tak:

$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); 

Albo zbudować drzewo który reprezentuje hierarchię poziomów domenie następująco:

$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, 
    ), 
    // … 
); 

Następnie można użyć następujących znaleźć meczu:

$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); 
0

Regex i parse_url() nie są rozwiązaniem dla Ciebie.

Potrzebujesz pakietu, który używa Public Suffix List, tylko w ten sposób możesz poprawnie wyodrębnić domeny z TLD dwóch, trzeciego poziomu (co.uk, a.bg, b.bg, itp.). Polecam użyć TLD Extract.

Oto przykład kodu:

$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' 
Powiązane problemy