【问题标题】:how to remove multiple slashes in URI with 'PREG' or 'HTACCESS'如何使用“PREG”或“HTACCESS”删除 URI 中的多个斜杠
【发布时间】:2011-06-14 04:41:48
【问题描述】:

如何使用“PREG”或“HTACCESS”删除 URI 中的多个斜杠

site.com/edition/new/// -> site.com/edition/new/


site.com/edition///new/ -> site.com/edition/new/

谢谢

【问题讨论】:

    标签: php .htaccess preg-replace preg-match preg-split


    【解决方案1】:
    $url = 'http://www.abc.com/def/git//ss';
    $url = preg_replace('/([^:])(\/{2,})/', '$1/', $url);
    // output http://www.abc.com/def/git/ss
    
    $url = 'https://www.abc.com/def/git//ss';
    $url = preg_replace('/([^:])(\/{2,})/', '$1/', $url);
    // output https://www.abc.com/def/git/ss
    

    【讨论】:

    • 很好的答案,你能解释一下这个正则表达式是如何工作的吗?
    • 在@ツLiverbool链接的工具上粘贴([^:])(\/{2,})作为正则表达式,然后粘贴$url作为测试字符串或任何其他你想测试的url
    • @Gilhan 序列 [...] 表示匹配这些字符中的任何一个。在这种情况下,[^:] 表示匹配除冒号以外的任何字符。前导 ^ 否定序列。该序列被括号括起来,使其成为“捕获组”,捕获的值可以在替换中用作 $1 序列 [\/]{2,} 表示查找两个或多个正斜杠。因为整个表达式由正斜杠分隔,所以匹配的正斜杠必须被转义,这就是反斜杠的作用。该序列被括号括起来,因此它也被捕获,但不是必需的。
    • @Gilhan 请注意,如果存在多个正斜杠序列,则答案中提供的示例不起作用,例如:example.com/def//git//ss,因为表达式将匹配第一个实例。为了解决这个问题,它应该使用“贪婪”指令:preg_replace('/([^:])\/{2,}/g', '/')
    【解决方案2】:

    在正则表达式中使用加号+ 表示出现一个或多个前一个字符。所以我们可以将它添加到 preg_replace 中,用其中一个替换出现的一个或多个/

       $url =  "site.com/edition/new///";
    
    $newUrl = preg_replace('/(\/+)/','/',$url);
    
    // now it should be replace with the correct single forward slash
    echo $newUrl
    

    【讨论】:

    • 好主意,但我怎样才能在'edition'之后进行检查作为这个例子 $ url = "site.com/edition///new///"; $newUrl = preg_replace('/edition(\/+)/','/',$url);我不知道申请
    【解决方案3】:

    简单,看看这个例子:

    $url ="http://portal.lojav1.local//Settings////messages";
    echo str_replace(':/','://', trim(preg_replace('/\/+/', '/', $url), '/'));
    

    输出:

    http://portal.lojav1.local/Settings/messages
    

    【讨论】:

      【解决方案4】:

      编辑:哈,我把这个问题读成“没有怀孕”哦:3

      function removeabunchofslashes($url){
        $explode = explode('://',$url);
        while(strpos($explode[1],'//'))
          $explode[1] = str_replace('//','/',$explode[1]);
        return implode('://',$explode);
      }
      
      echo removeabunchofslashes('http://www.site.com/edition////new///');
      

      【讨论】:

        【解决方案5】:

        http://domain.com/test/test/ > http://domain.com/test/test

        # Strip trailing slash(es) from uri
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.+?)[/]+$ $1 [NC,R,L]
        

        http://domain.com//test//test// > http://domain.com/test/test/

        # Merge multiple slashes in uri
        RewriteCond %{THE_REQUEST} ^[A-Z]+\ //*(.+)//+(.*)\ HTTP
        RewriteRule ^ /%1/%2 [R,L]
        RewriteCond %{THE_REQUEST} ^[A-Z]+\ //+(.*)\ HTTP
        RewriteRule ^ /%1 [R,L]
        

        如果测试后一切正常,请将 R 更改为 R=301...

        有人知道如何使用上述方法在查询中保留双斜杠吗?

        (例如:/test//test//?test=test//test > /test/test/?test=test//test)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多