【问题标题】:Regular expression, replace multiple slashes with only one正则表达式,只用一个替换多个斜杠
【发布时间】:2011-01-14 03:16:19
【问题描述】:

这似乎是一个容易解决的问题,但并不像看起来那么容易。我在 PHP 中有这个字符串:

////%postname%/

这是一个 URL,我不想连续使用多个斜杠。我从不想完全删除斜线。

它应该是这样的:

/%postname%/

因为结构可能看起来不同,我认为我需要一个聪明的 preg 替换正则表达式。它需要像这样使用 URL:

////%postname%//mytest/test///testing

应该转换成这个:

/%postname%/mytest/test/testing

【问题讨论】:

    标签: php preg-replace


    【解决方案1】:

    给你:

    $str = preg_replace('~/+~', '/', $str);
    

    或者:

    $str = preg_replace('~//+~', '/', $str);
    

    甚至:

    $str = preg_replace('~/{2,}~', '/', $str);
    

    一个简单的str_replace() 也可以解决问题(如果连续的斜线不超过两个):

    $str = str_replace('//', '/', $str);
    

    【讨论】:

    • 比预期的要短得多。我不能让它失败。谢谢!
    • str_replace 不会这样做。我相信你需要一个递归函数。 (看看下面)
    • 正如 Gal 所说,如果有两个以上的斜杠,str_replace 将不起作用。 preg_replace 可以,但 Bart K 的版本更好,因为它不匹配单斜杠,只有两个或更多
    • @meouw:谢谢,我对那个有疑问 - 现在已修复。
    【解决方案2】:

    试试:

    echo preg_replace('#/{2,}#', '/', '////%postname%//mytest/test///testing');
    

    【讨论】:

      【解决方案3】:
      function drop_multiple_slashes($str)
      {
        if(strpos($str,'//')!==false)
        {
           return drop_multiple_slashes(str_replace('//','/',$str));
        }
        return $str;
      }
      

      使用 str_replace

      【讨论】:

      • 除非您将 !== 0 更改为 !== false,否则这将不起作用。另外,不需要递归: while (strpos($str, '//') !== false) { $str = str_replace('//', '/', $str); } 返回 $str;
      • @GZipp,你说得对,我编辑了它。据我所知,递归函数和 while 循环在性能上没有区别(但我很乐意证明不是这样)。
      【解决方案4】:

      晚了,但所有这些方法也会删除 http:// 斜线,但是这个。

      function to_single_slashes($input) {
          return preg_replace('~(^|[^:])//+~', '\\1/', $input);
      }
      
      # out: http://localhost/lorem-ipsum/123/456/
      print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/');
      

      【讨论】:

        【解决方案5】:

        我的解决方案:

        while (strlen($uri) > 1 && $uri[0] === '/' && $uri[1] === '/') {
            $uri = substr($uri, 1);
        }
        

        【讨论】:

          【解决方案6】:
          echo str_replace('//', '/', $str);
          

          【讨论】:

          • 不,这会将'////' 替换为'//',而这里需要一个斜杠。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多