РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ PHP: Получить домен по 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, но ни один из них не был именно тем, что я искал.

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

Author: Adam, 2010-08-09

8 answers

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

$domain = parse_url($url, PHP_URL_HOST);
 69
Author: cletus, 2010-08-09 17:04:13

Я использую:

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

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

 2
Author: Marcin Żurek, 2016-05-17 14:52:36

Предполагает, что http:// добавляет префиксы ко всему.

$tmp = explode("/", $url);
$domain = $tmp[2];
 1
Author: Josh K, 2010-08-09 17:04:06
$tmp = parse_url($url);
$url = $tmp['host']
 1
Author: turbod, 2010-08-09 17:07:04

Это похоже на регулярное выражение из theraccoonbear, но с поддержкой доменов HTTPS.

if (preg_match('/https?:\/\/([^\/]+)\//i', $target_string, $matches)) {
  $domain = $matches[1];
}
 1
Author: fnkr, 2017-05-23 12:02:17

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

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

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

 0
Author: haydenmuhl, 2010-08-09 17:03:14
if (preg_match('/http:\/\/([^\/]+)\//i', $target_string, $matches)) {
  $domain = $matches[1];
}
 0
Author: theraccoonbear, 2010-08-09 17:05:13

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

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