Получите доменное имя (не субдомен) в php

У меня есть URL, который может быть любым из следующих форматов:

http://example.com
https://example.com
http://example.com/foo
http://example.com/foo/bar
www.example.com
example.com
foo.example.com
www.foo.example.com
foo.bar.example.com
http://foo.bar.example.com/foo/bar
example.net/foo/bar

По существу я должен смочь соответствовать любому нормальному URL. Как я могу извлечь example.com (или .NET, независимо от того, что tld, оказывается. Мне нужно это для работы с любым TLD.) от всех них через единственный regex?

30
задан Lightness Races with Monica 7 February 2012 в 11:52
поделиться

1 ответ

Что ж, вы можете использовать parse_url для получения хоста:

$info = parse_url($url);
$host = $info['host'];

Затем вы можете проделать некоторые причудливые вещи, чтобы получить только TLD и хост

$host_names = explode(".", $host);
$bottom_host_name = $host_names[count($host_names)-2] . "." . $host_names[count($host_names)-1];

Не очень элегантно, но должно работать.


Если вам нужно объяснение, вот оно:

Сначала мы берем все, что находится между схемой ( http: // и т. Д.), Используя возможности parse_url . чтобы ... ну .... разобрать URL-адреса. :)

Затем мы берем имя хоста и разделяем его на массив в зависимости от того, где находятся точки, так что test.world.hello.myname будет выглядеть следующим образом:

array("test", "world", "hello", "myname");

После этого мы берем количество элементов в массиве (4).

Затем мы вычитаем из него 2, чтобы получить предпоследнюю строку (имя хоста или пример в вашем примере)

Затем мы вычитаем из него 1, чтобы получить последнюю строку ( потому что ключи массива начинаются с 0), также известного как TLD

. Затем мы объединяем эти две части с точкой, и у вас есть базовое имя хоста.

42
ответ дан 27 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

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