【问题标题】:Regex for dropping http:// and www. from URLs用于删除 http:// 和 www 的正则表达式。从网址
【发布时间】:2011-07-18 20:05:16
【问题描述】:

我有一堆这样的网址。

  $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。有任何想法吗?

【问题讨论】:

    标签: php regex string


    【解决方案1】:

    preg_replace 也可以接受一个数组,所以你甚至不需要循环。你可以用一个衬垫做到这一点:

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

    【讨论】:

    • 感谢 PaulPRO 的赏金,我只是不明白为什么。你的答案很完美。
    • 这应该做同样的事情:$urls = preg_replace('~^(?:https?://)?(?:www\.)?~i', '', $urls);.
    • @paulpro 这可以同时使用 http 和 https 吗?
    • @Azzo 是的,? 使 s 成为可选的。
    【解决方案2】:
    /^(https?:\/\/)?(www\.)?(.*)\/$/i
    

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

    【讨论】:

      【解决方案3】:

      又短又甜:

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

      【讨论】:

        【解决方案4】:

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

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

        parse_url 将为您提供 URL 的主机,即使它包含端口号或 HTTP 身份验证数据。 (这是否是您需要的,但取决于您的具体用例。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 2021-06-08
          • 2010-10-06
          • 2010-11-11
          相关资源
          最近更新 更多