web-dev-qa-db-fra.com

Comment effacez-vous le nom de domaine d'une URL en php?

Je cherche une méthode (ou une fonction) pour supprimer la partie domain.ext de toute URL introduite dans la fonction. L'extension de domaine peut être n'importe quoi (.com, .co.uk, .nl, .w importe), et l'URL qui y est introduite peut être n'importe quoi de http://www.domain.com à www.domain .com/path/script.php? = peu importe

Quelle est la meilleure façon de s'y prendre?

42
user15063

parse_url transforme une URL en un tableau associatif:

php > $foo = "http://www.example.com/foo/bar?hat=bowler&accessory=cane";
php > $blah = parse_url($foo);
php > print_r($blah);
Array
(
    [scheme] => http
    [Host] => www.example.com
    [path] => /foo/bar
    [query] => hat=bowler&accessory=cane
)
86
Robert Elwell

Vous pouvez utiliser parse_url () pour faire ceci:

$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_Host);
$domain = str_replace('www.','',$domain);

Dans cet exemple, $ domain devrait contenir example.com, qu’il ait ou non www. Cela fonctionne également pour un domaine tel que .co.uk

11
DavidM

Vous pouvez également écrire une expression régulière pour obtenir exactement ce que vous voulez.

Voici ma tentative:

$pattern = '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i';
$url = 'http://www.example.com/foo/bar?hat=bowler&accessory=cane';
if (preg_match($pattern, $url, $matches) === 1) {
    echo $matches[0];
}

La sortie est:

example.com

Ce modèle prend également en compte des domaines tels que "exemple.com.au".

Remarque: je n'ai pas consulté le RFC correspondant.

10
firstresponder

Voici quelques fonctions simples permettant d’obtenir le domaine racine (example.com) à partir d’un domaine normal ou long (test.sub.domain.com) ou d’une adresse URL (http://www.example.com).

/**
 * Get root domain from full domain
 * @param string $domain
 */
public function getRootDomain($domain)
{
    $domain = explode('.', $domain);

    $tld = array_pop($domain);
    $name = array_pop($domain);

    $domain = "$name.$tld";

    return $domain;
}

/**
 * Get domain name from url
 * @param string $url
 */
public function getDomainFromUrl($url)
{
    $domain = parse_url($url, PHP_URL_Host);
    $domain = $this->getRootDomain($domain);

    return $domain;
}
2
Mark Shust

Résolu ceci ... 

Disons que nous appelons dev.mysite.com et que nous voulons extraire 'mysite.com'

$requestedServerName = $_SERVER['SERVER_NAME']; // = dev.mysite.com

$thisSite = explode('.', $requestedServerName); // site name now an array

array_shift($thisSite); //chop off the first array entry eg 'dev'

$thisSite = join('.', $thisSite); //join it back together with dots ;)

echo $thisSite; //outputs 'mysite.com'

Fonctionne aussi avec mysite.co.uk, alors ça devrait marcher partout :)

1
z3ro

J'ai passé un peu de temps à réfléchir à la question de savoir s'il était logique d'utiliser une expression régulière pour cela, mais au final, je ne le pense pas. 

les expressions rationnelles du premier répondant m'avaient presque convaincue que c'était la meilleure solution, mais cela ne fonctionnait pas si rien ne manquait d'un slash final (so http://example.com , par exemple). J'ai corrigé cela avec ce qui suit: '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i', mais j'ai alors réalisé que cela correspondait deux fois à des URL telles que ' http://example.com/index.htm '. Oops. Ce ne serait pas si grave (utilisez simplement le premier), mais cela correspond aussi à deux reprises sur quelque chose comme ceci: ' http://abc.ed.fg.hij.kl.mn/ ', et le Le premier match n'est pas le bon. :(

Un collègue a suggéré de simplement obtenir l'hôte (via parse_url()), puis de ne prendre que les deux ou trois derniers bits du tableau (split() sur '.'). Les deux ou trois seraient basés sur une liste de domaines, comme 'co.uk ', etc. L'établissement de cette liste devient la partie la plus difficile.

0
livingtech

Il existe un seul moyen correct d'extraire des parties de domaine: son utilisation Liste de suffixes publics (base de données de TLD). Je recommande TLDExtract package, voici un exemple de code:

$extract = new LayerShifter\TLDExtract\Extract();

$result = $extract->parse('www.domain.com/path/script.php?=whatever');
$result->getSubdomain(); // will return (string) 'www'
$result->getHostname(); // will return (string) 'domain'
$result->getSuffix(); // will return (string) 'com'
0