У меня есть куча 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. (Это то, что вам нужно, зависит от вашего конкретного варианта использования.)