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 но ни один из них не был именно тем, что я искал.

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

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

 $domain = parse_url($url, PHP_URL_HOST); 

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

 $tmp = explode("/", $url); $domain = $tmp[2]; 
 $tmp = parse_url($url); $url = $tmp['host'] 

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

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

Я использую:

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

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

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

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

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

 if (preg_match('/http:\/\/([^\/]+)\//i', $target_string, $matches)) { $domain = $matches[1]; } 

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

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