从路径中删除不必要的斜杠

时间:2012-09-19 12:16:03

标签: php

$path = '/home/to//my///site';

我正在尝试从上面的路径中删除不必要的正斜杠/

我想要得到这个结果

/home/to/my/site

我用str_replace失败了,因为我不知道斜杠的数量。

6 个答案:

答案 0 :(得分:26)

优雅的解决方案

使用preg_replace,您可以使用一行代码获取此内容:

preg_replace('#/+#','/',$str);

模式/+将匹配前向距离/一次或多次,并将其替换为单个/

不那么优雅的解决方案

当然还有其他方法可以实现这一点,例如使用while循环。

while( strpos($path, '//') !== false ) {
   $path = str_replace('//','/',$path);
}

这将调用str_replace,直到所有//被替换为止。如果你想牺牲可读性(不建议),你也可以在一行代码中编写该循环。

while( strpos( ($path=str_replace('//','/',$path)), '//' ) !== false );

答案 1 :(得分:9)

如果有人想从URL中删除额外的斜杠而不删除http / https之后的前两个斜杠:

$url = preg_replace('/([^:])(\/{2,})/', '$1/', $url); 

(感谢ツLiverbool how to remove multiple slashes in URI with 'PREG' or 'HTACCESS'

答案 2 :(得分:2)

您好,这可能会有所帮助

将此代码写入.Htaccess文件并进行检查..

# Prevent double slashes in URLs, e.g. //Blog and /Home//About
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

希望它会对你有所帮助!

答案 3 :(得分:2)

您可以使用内置函数realpath()来删除现有文件的斜杠。但是你总会得到一个规范化的绝对​​路径名。

<?php
// 2 slashes
echo realpath('/etc//passwd') . PHP_EOL; // prints /etc/password
// 3 slashes
echo realpath('/etc///passwd') . PHP_EOL; // prints /etc/password
// 2 ..
echo realpath('/etc/../etc/passwd') . PHP_EOL; // prints /etc/password
?>

请注意,如果文件不存在,此函数会返回错误。

docs的一些重要评论:

  

realpath()展开所有符号链接并解析对它的引用   '/./','/../'和输入路径中的额外'/'字符并返回   规范化的绝对​​路径名。

  

在Windows上,realpath()会将unix样式路径更改为Windows样式。

答案 4 :(得分:0)

while(strlen($path) != (strlen($path = str_replace('//','/', $path))));

此代码用双斜杠替换双斜杠,只要它改变长度;

答案 5 :(得分:0)

它替换(和连续)出现/和\ DIRECTORY_SEPARATOR中的任何内容,以及进程/。和/ ..很好。 get_absolute_path()返回的路径包含no (后面)斜线在位置0(字符串的开头)或 位置-1(结束)

function get_absolute_path($path) {
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.' == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    return implode(DIRECTORY_SEPARATOR, $absolutes);
}

测试:

var_dump(get_absolute_path('this/is/../a/./test/.///is'));

返回:string(14)"this/a/test/is"