2010-10-04 12 views
6

Digamos que tengo just-a.domain.com,just-a-domain.info,just.a-domain.net cómo puedo eliminar la extensión .com,.net.info ... y necesito los resultados en dos variables, una con el nombre de dominio y otra con la extensión.Eliminar la extensión de dominio

he intentado con str_replace pero no funciona, supongo que sólo con la expresión regular ....

+5

¿Qué partes deben volver www.google.co.uk? – Matthew

Respuesta

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

Esto produce la siguiente matriz

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

funciona, pero solo para dominios con un DOT en la extensión. P.ej. para ".com.br" no funcionará. – almo

+0

@almo Obtenga el resultado usando el script y luego vuelva a dividir el resultado :) –

-1
strrpos($str, ".") 

le dará el índice correspondiente al último período en la cadena, entonces se puede utilizar con el substr() indexe y devuelva la cadena corta.

+0

no funcionará para .co.uk .com.br etc. –

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

$ coincidencias [1] tendrán el dominio y partidos $ [2] tendrán la extensión

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

producirá la salida

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

Si desea eliminar la parte del dominio que administran los registradores de nombres de dominio, deberá usar una lista de tales sufijos como the Public Suffix List.

Pero desde un paseo a través de esta lista y probar el sufijo en el nombre de dominio no es tan eficiente, en lugar utilizar esta lista sólo para construir un índice de esta manera:

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

La búsqueda de la mejor combinación sería entonces algo así:

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

o construir un árbol que representa la jerarquía de los niveles de nombre de dominio de la siguiente manera:

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

continuación, puede utilizar el siguiente para encontrar la combinación:

$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

expresiones regulares y parse_url() no son la solución para usted.

Necesita el paquete que usa Public Suffix List, solo de esta manera puede extraer correctamente dominios con TLDs de dos, tercer nivel (co.uk, a.bg, b.bg, etc.). Recomiendo usar TLD Extract.

Aquí ejemplo de código:

$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' 
Cuestiones relacionadas