Regex для удаления http: // и www. из URL-адресов

У меня есть куча URL-адресов, подобных этим.

$urls = array( 'https://site1.com', 'https://www.site2.com', 'http://www.site3.com', 'https://site4.com', 'site5.com', 'www.site6.com', 'www.site7.co.uk', 'site8.tk' ); 

Я хотел удалить http, https,: // и www. из этих строк, чтобы выход выглядел так.

  $urls = array( 'site1.com', 'site2.com', 'site3.com', 'site4.com', 'site5.com', 'site6.com', 'site7.co.uk', 'site8.tk' ); 

Я придумал это решение.

 foreach ($urls as $url) { $pattern = '/(http[s]?:\/\/)?(www\.)?/i'; $replace = ""; echo "before: $url after: ".preg_replace('/\/$/', '', preg_replace($pattern, $replace, $url))."\n"; } 

Мне было интересно, как я мог избежать второго preg_replace. Есть идеи?

preg_replace также может принимать массив, поэтому вам даже не нужен цикл. Вы можете сделать это с помощью одного лайнера:

 $urls = preg_replace('/(?:https?:\/\/)?(?:www\.)?(.*)\/?$/i', '$1', $urls); 
 /^(https?:\/\/)?(www\.)?(.*)\/$/i 

И используйте то, что стоит 3 $3 . Или, что еще лучше, измените первые две круглые скобки на не захватывающую версию (?:) и используйте то, что на 1.

Короткие и сладкие:

 $urls = preg_replace('~^(?:https?://)?(?:www[.])?~i', '', $urls); 

В зависимости от того, что именно вы хотите сделать, может быть лучше придерживаться собственных средств анализа URL-адресов PHP, а именно parse_url :

 foreach ($urls as &$url) { $url = preg_replace('~^www.~', '', parse_url($url, PHP_URL_HOST)); } unset($url); 

parse_url предоставит вам хост URL-адреса, даже если он будет содержать номер порта или данные проверки подлинности HTTP. (Это то, что вам нужно, зависит от вашего конкретного варианта использования.)