2008-10-06 2 views
39

Im ищет метод (или функцию), чтобы вырезать часть domain.ext любого URL-адреса, который подается в функцию. Расширение домена может быть любым (.com, .co.uk, .nl, anywhatever), а URL, который загружается в него, может быть любым: от http://www.domain.com до www.domain.com/path/script.php?=whateverКак вы удаляете доменное имя из URL-адреса в php?

Каков наилучший способ сделать это?

+0

возможно дубликат [PHP Получение доменного имени от Субдомена] (http://stackoverflow.com/questions/1201194/php-getting-domain-name-from- subdomain) – tripleee 2013-08-15 08:39:03

ответ

80

parse_url превращает URL в ассоциативный массив:

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

Вы можете использовать parse_url() сделать это:

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

В этом примере $ домен должен содержать example.com.

+0

Не должно быть parse_url() вместо url_parse() – 2008-10-06 21:39:00

+1

Примечание: второй аргумент для parse_url является изобретением PHP5. Любой на PHP4 (обновите, пожалуйста, за любовь к Богу ...) нужно будет использовать способ Роберта Элвелла. – ceejayoz 2008-10-06 22:36:40

+0

Любой, кто на PHP4 ... должен будет обновиться. – 2008-10-06 23:38:33

10

Вы также можете написать регулярное выражение, чтобы получить именно то, что вы хотите.

Вот моя попытка на него:

$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]; 
} 

Выход:

example.com 

Эта модель также учитывает домены, такие как 'example.com.au'.

Примечание: Я не обращался к соответствующему RFC.

0

Я потратил некоторое время на размышления о том, имеет ли смысл использовать регулярное выражение для этого, но, в конце концов, я думаю, что нет.

regexp firstresponder приблизился к тому, чтобы убедить меня, что это лучший способ, но он не работал ни с чем, у которого отсутствовала конечная косая черта (например, http://example.com). Я исправил это следующим образом: '/\w+\..{2,3}(?:\..{2,3})?(?=[\/\W])/i', но потом я понял, что соответствует двум URL-адресам, например «http://example.com/index.htm». К сожалению. Это не так уж плохо (просто используйте первый), но он также дважды совпадает с чем-то вроде этого: «http://abc.ed.fg.hij.kl.mn/», и первое совпадение неверно. :(

Сотрудник предложил только получить хост (через parse_url()), а затем просто взять последние два или три бита массива (split() on '.'). Два или три будут основаны на списке доменов , как «co.uk» и т.д. Составление этого списка становится трудная часть.

1

решаемые это ...

Say мы называем dev.mysite.com, и мы хотим, чтобы извлечь «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' 

Работы с mysite.co.uk тоже должны работать каждый здесь :)

2

Вот несколько простых функций для получения корневого домена (example.com) из обычного или длинного домена (test.sub.domain.com) или 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; 
} 
0

Существует только один правильный способ извлечь часть домена, это использовать Public Suffix List (база данных ДВУ).Я рекомендую TLDExtract пакет, вот пример кода:

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