Откройте канал в командной оболочке и запишите программный код в этот канал. Вот пример: http://support.microsoft.com/default.aspx?scid=kb;en-us;190351
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
)
Существует только один правильный способ извлечения частей домена, это использование Public Suffix List (база данных TLD). Я рекомендую пакет 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'
Вы можете использовать parse_url () , чтобы сделать это:
$url = 'http://www.example.com';
$domain = parse_url($url, PHP_URL_HOST);
В этом примере $ domain должен содержать example.com.
Вы также можете написать регулярное выражение, чтобы получить именно то, что вы хотите.
Вот моя попытка:
$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.
Я потратил некоторое время на размышления о том, имеет ли смысл использовать регулярное выражение для этого, но, в конце концов, я думаю, что нет.
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()
на '.'). Два или три основываться на списке доменов, таких как «co.uk» и т. д. Составление этого списка становится трудным.
Вот несколько простых функций для получения корневого домена (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;
}
Решено ...
Предположим, что мы вызываем 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 тоже так должен работать везде:)
www.mydomain.co.uk // outputs 'mydomain.co.uk' mydomain.co.uk // outputs co.uk
– jaredstenquist
24 April 2013 в 22:31