PHP Удалить домен из URL [дубликат]

Откройте канал в командной оболочке и запишите программный код в этот канал. Вот пример: http://support.microsoft.com/default.aspx?scid=kb;en-us;190351

40
задан qasimzee 31 July 2013 в 09:39
поделиться

7 ответов

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
)
82
ответ дан NDM 17 August 2018 в 10:09
поделиться
  • 1
    Какой был бы лучший способ лишить WWW. если он присутствует в домене. IM не хорошо с регулярным выражением. Непонятный способ, о котором я могу думать, - $ www_check = substr ($ domain, 0,4); if ($ www_check == & quot; www. & quot;) {echo substr ($ domain, 4); } else {echo $ domain; } – user 6 October 2008 в 23:08
  • 2
    @Yegor: $ domain = preg_replace ('/ ^ www./''''$domain); – Kent Fredric 7 October 2008 в 00:37
  • 3
    э. сделайте это \. нет. – Kent Fredric 7 October 2008 в 00:37
  • 4
    Мне нравится взорваться на "www. & Quot; а затем использовать первый экземпляр в массиве. Как правило, это нормально. – Robert Elwell 7 October 2008 в 03:12
  • 5
    Тщательный Роберт, поскольку у многих URls нет перед ними WWW. ie images.google.com – gradbot 7 October 2008 в 03:22

Существует только один правильный способ извлечения частей домена, это использование 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'
0
ответ дан Alexander Fedyashov 17 August 2018 в 10:09
поделиться

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

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

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

10
ответ дан DavidM 17 August 2018 в 10:09
поделиться
  • 1
    Не должно быть parse_url () вместо url_parse () – Darryl Hein 6 October 2008 в 22:39
  • 2
    Примечание: второй аргумент для parse_url - это изобретение PHP5. Любой на PHP4 (обновите, пожалуйста, за любовь к Богу ...) нужно будет использовать способ Роберта Элвелла. – ceejayoz 6 October 2008 в 23:36
  • 3
    Любой, кто на PHP4 ... должен будет обновиться. – Kent Fredric 7 October 2008 в 00:38
  • 4
    $ domain содержит www.example.com. – Gary 10 March 2012 в 02:23

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

Вот моя попытка:

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

10
ответ дан firstresponder 17 August 2018 в 10:09
поделиться
  • 1
    Это лучшее решение для всех случаев. благодаря – Jared Eitnier 27 February 2013 в 17:08
  • 2
    Могу ли я использовать этот шаблон регулярного выражения на другом языке? – User 28 March 2014 в 21:26

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

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» и т. д. Составление этого списка становится трудным.

0
ответ дан livingtech 17 August 2018 в 10:09
поделиться

Вот несколько простых функций для получения корневого домена (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;
}
2
ответ дан Mark Shust 17 August 2018 в 10:09
поделиться

Решено ...

Предположим, что мы вызываем 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 тоже так должен работать везде:)

1
ответ дан z3ro 17 August 2018 в 10:09
поделиться
  • 1
    Не работает с 2 части TLD, если у вас нет субдомена. www.mydomain.co.uk // outputs 'mydomain.co.uk' mydomain.co.uk // outputs co.uk – jaredstenquist 24 April 2013 в 22:31
Другие вопросы по тегам:

Похожие вопросы: