У меня есть 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?
Что ж, вы можете использовать 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
. Затем мы объединяем эти две части с точкой, и у вас есть базовое имя хоста.