PHP REGEX: получить домен из URL

Что я хочу


Я хочу получить от URL часть domain, поэтому от http://example.com/ -> example.com

Примеры:


+----------------------------------------------+-----------------------+
| input                                        | output                |
+----------------------------------------------+-----------------------+
| http://www.stackoverflow.com/questions/ask   | www.stackoverflow.com |
| http://validator.w3.org/check                | validator.w3.org      |
| http://www.google.com/?q=hello               | www.google.com        |
| http://google.de/?q=hello                    | google.de             |
+----------------------------------------------+-----------------------+

Я нашел несколько связанных вопросов в stackoverflow, но ни один из них не был именно тем, что я искал.

Спасибо за любую помощь!


person Adam Halasz    schedule 09.08.2010    source источник
comment
Этот код поможет вам получить полное доменное имя: gist.github.com/praisedpk/64bdb80d28144aa78d58469324432277.   -  person Hamid Sarfraz    schedule 18.09.2016


Ответы (7)


Для этого нет необходимости использовать регулярное выражение. PHP имеет встроенную функцию для этого. Используйте parse_url():

$domain = parse_url($url, PHP_URL_HOST);
person cletus    schedule 09.08.2010
comment
это хорошо, только если содержит http(s) , а не для stackoverflow.com/questions - person ewwink; 27.01.2014
comment
это также даст вам поддомены. Будьте осторожны, потому что parse_url('http://example.com', PHP_URL_HOST) == parse_url('http://www.example.com', PHP_URL_HOST) вернет false - person Jonathan Morales Vélez; 14.05.2015

Я использую:

$domain = parse_url('http://' . str_replace(array('https://', 'http://'), '', $url), PHP_URL_HOST);

Поскольку parse_url не возвращает ключ хоста, если схема отсутствует в $url.

person Marcin Żurek    schedule 17.05.2016

Предполагается, что http:// предшествует всему.

$tmp = explode("/", $url);
$domain = $tmp[2];
person Josh K    schedule 09.08.2010
comment
хех, самое нестандартное решение :-) - person gnud; 09.08.2010

Это похоже на regex от theraccoonbear, но с поддержкой HTTPS. домены.

if (preg_match('/https?:\/\/([^\/]+)\//i', $target_string, $matches)) {
  $domain = $matches[1];
}
person fnkr    schedule 06.12.2013

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

Эта диаграмма объясняет, как это работает, вернее, почему это работает :-)

$regexp = '/.*\/\/([^\/:]+).*/';

// www.stackoverflow.com
echo preg_replace($regexp, '$1', 'http://www.stackoverflow.com/questions/ask');

// google.de
echo preg_replace($regexp, '$1', 'http://google.de/?q=hello');

// it works for the other input tests too ;-)
person Eugen Mihailescu    schedule 27.07.2019

Вот мое быстрое и грязное решение.

http://([^/]+).*

Я не тестировал его, но он должен захватить что-нибудь между http:// и первой косой чертой.

person haydenmuhl    schedule 09.08.2010

Лучший способ, я думаю:

preg_match('/(http(|s)):\/\/(.*?)\//si',  'http://www.example.com/page/?bla=123#!@#$%^&*()_+', $output);
// $output[0] ------------>  https://www.example.com/
person T.Todua    schedule 24.04.2015