171 votes

Analyse de domaine depuis une URL en PHP

J'ai besoin de créer une fonction qui analyse le domaine à partir d'une URL.

Donc avec

http://google.com/dhasjkdas/sadsdds/sdda/sdads.html

ou

http://www.google.com/dhasjkdas/sadsdds/sdda/sdads.html

il devrait retourner google.com

avec

http://google.co.uk/dhasjkdas/sadsdds/sdda/sdads.html

il devrait retourner google.co.uk .

342voto

Owen Points 36009

vérifier parse_url() :

 $url = 'http://google.com/dhasjkdas/sadsdds/sdda/sdads.html';
$parse = parse_url($url);
print $parse['host']; // prints 'google.com'
 

note: parse_url ne gère pas très bien les URL malmenées, mais convient si vous attendez généralement des URL correctes

108voto

Alix Axel Points 63455
 $domain = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));
 

Cela renverrait les google.com pour les deux http://google.com/ ... et http://www.google.com/ ...

23voto

philfreo Points 12382

De http://us3.php.net/manual/en/function.parse-url.php#93983

pour une raison quelconque, parse_url renvoie l'hôte (ex. example.com) en tant que chemin lorsqu'aucun schéma n'est fourni dans l'URL en entrée. J'ai donc écrit une fonction rapide pour obtenir le vrai hôte:

 function getHost($Address) { 
   $parseUrl = parse_url(trim($Address)); 
   return trim($parseUrl['host'] ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2))); 
} 

getHost("example.com"); // Gives example.com 
getHost("http://example.com"); // Gives example.com 
getHost("www.example.com"); // Gives www.example.com 
getHost("http://example.com/xyz"); // Gives example.com 
 

14voto

Andreas M. Hahn Points 101

L'interne de la fonction PHP parse_url n'est pas toujours suffisant pour analyser les Url ou Uri correctement dans leurs composantes, comme l'Hôte ou du Domaine, de Chemin, de Segments, de la Requête et le Fragment.

Dans ce cas, vous avez besoin d'un résultat fiable d'array comme ceci:

 - [SCHEME] => http
 - [AUTHORITY] =>
   user:pass@www.domain.com:80
 - [USERINFO] => user:pass
 - [USER] => user
 - [PASS] => pass
 - [HOST] => www.domain.com
 - [REGNAME] => www.domain.com
 - [DOMAIN] => www.domain.com
 - [LABEL][] =>
 - [LABEL][] => com
 - [LABEL][] => domain
 - [LABEL][] => www
 - [PORT] => 80
 - [PATH] => /dir1/dir2/page.html
 - [SEGMENT][] => dir1
 - [SEGMENT][] => dir2
 - [SEGMENT][] => page.html
 - [QUERY] => key1=value1&key2=value2
 - [GET][key1] => value1
 - [GET][key2] => value2
 - [FRAGMENT] => anchor/line
 - [ANCHOR][] => anchor
 - [ANCHOR][] => line

Il y a un standard conforme, robuste et performant Classe PHP pour manipuler et analyser les Url / Uri selon RFC 3986 et RFC 3987 disponible pour le téléchargement et l'utilisation gratuite:

http://andreas-hahn.com/en/parse-url

13voto

Shaun Points 61

Le code qui a été prévu pour fonctionner à 100% ne semblent pas à la couper pour moi, je n'ai correctif de l'exemple un peu mais le code qui n'était pas d'aider et de problèmes avec elle. alors je l'ai changé pour un couple de fonctions (pour économiser de demander la liste à partir de mozilla tout le temps, et la suppression de la cahce système). Cela a été testé sur un ensemble de 1000 URLs et semblait fonctionner.

function domain($url)
{
    global $subtlds;
    $slds = "";
    $url = strtolower($url);

   $host = parse_url('http://'.$url,PHP_URL_HOST);

    preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
    foreach($subtlds as $sub){
        if (preg_match('/\.'.preg_quote($sub).'$/', $host, $xyz)){
            preg_match("/[^\.\/]+\.[^\.\/]+\.[^\.\/]+$/", $host, $matches);
        }
    }

    return @$matches[0];
}

function get_tlds(){
    $address = 'http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1';
    $content = file($address);
    foreach($content as $num => $line){
            $line = trim($line);
            if($line == '') continue;
            if(@substr($line[0], 0, 2) == '/') continue;
            $line = @preg_replace("/[^a-zA-Z0-9\.]/", '', $line);
            if($line == '') continue;  //$line = '.'.$line;
            if(@$line[0] == '.') $line = substr($line, 1);
            if(!strstr($line, '.')) continue;
            $subtlds[] = $line;
            //echo "{$num}: '{$line}'"; echo "<br>";
    }

    $subtlds = array_merge(array(
            'co.uk', 'me.uk', 'net.uk', 'org.uk', 'sch.uk', 'ac.uk', 
            'gov.uk', 'nhs.uk', 'police.uk', 'mod.uk', 'asn.au', 'com.au',
            'net.au', 'id.au', 'org.au', 'edu.au', 'gov.au', 'csiro.au'
            ),$subtlds);

    $subtlds = array_unique($subtlds);

    return $subtlds;    
}

Ensuite l'utiliser comme

$subtlds = get_tlds();
echo domain('www.example.com') //outputs: exmaple.com
echo domain('www.example.uk.com') //outputs: exmaple.uk.com
echo domain('www.example.fr') //outputs: exmaple.fr

Je sais que je devrais avoir tourné cela en classe, mais n'avait pas le temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X