Regex для удаления http: // и www. с URL - PullRequest
3 голосов
/ 19 июля 2011

У меня есть несколько таких ссылок.

  $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.Есть идеи?

Ответы [ 4 ]

14 голосов
/ 19 июля 2011

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

$urls = preg_replace('/(?:https?:\/\/)?(?:www\.)?(.*)\/?$/i', '$1', $urls);
13 голосов
/ 19 июля 2011
/^(https?:\/\/)?(www\.)?(.*)\/$/i

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

0 голосов
/ 12 сентября 2011

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

$urls = preg_replace('~^(?:https?://)?(?:www[.])?~i', '', $urls);
0 голосов
/ 11 сентября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...