从URL中删除"http://"和"www."的正则表达式

3

我有一堆像这样的网址。

  $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

preg_replace函数也可以接受一个数组,因此您甚至不需要循环。您可以使用一行代码实现:

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

感谢PaulPRO的奖励,我只是不太明白为什么。你的答案非常完美。 - sidyll
这个也可以实现同样的效果: $urls = preg_replace('~^(?:https?://)?(?:www\.)?~i', '', $urls); - Alix Axel
@paulpro 这个能同时支持 http 和 https 吗? - AlwaysStudent
@Azzo 是的,? 使 s 可选。 - Paul

13
/^(https?:\/\/)?(www\.)?(.*)\/$/i

使用$3中的内容。或者,更好的做法是将前两个括号改为非捕获版本(?:),然后使用1中的内容。


0

根据您想要做什么,最好使用PHP自己的URL解析工具,即parse_url

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

parse_url函数会返回URL的主机部分,即使它包含端口号或HTTP认证数据。(但是否满足你的需求取决于具体的使用情况。)


0

简短而精炼:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接