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

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

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

我正在努力获得这个结果

/home/to/my/site

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


为什么烦恼呢?如果它们能够发挥作用,那么移除它们的意义何在? - Ed Heal
这是一个文件管理器脚本,该路径将显示给脚本的用户。 - Alaa Gamal
为什么首先要有双斜杠? - Ed Heal
2
@Ed Heal 上面的代码只是用于测试,而且我在我的请求上很自由,因为它不会伤害其他人,谢谢。 - Alaa Gamal
使用PHP原生函数realpath('/home/to//my///site')来获取路径的真实路径。 - undefined
6个回答

37

优雅的解决方案

使用preg_replace,您可以用一行代码实现这个效果:

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

模式/+将匹配正斜杠/一次或多次,并用单个/替换它。

不太优雅的解决方案

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

while( strpos($path, '//') !== false ) {
   $path = str_replace('//','/',$path);
}
这将调用str_replace直到所有出现的//都被替换。如果您愿意牺牲可读性(不建议),您还可以在一行代码中编写该循环。
while( strpos( ($path=str_replace('//','/',$path)), '//' ) !== false );

我对正则表达式不是很擅长,但为什么不使用 \/{2,} 来减少检查单个 / 的循环,这是不必要的。 - Muhammad Omer Aslam
如果您想将其用于URL,此正则表达式是协议安全的:preg_replace('#(?<!:)/+#gm', '/', $str); - Matt Kenefick

13

4

您好,希望这篇翻译能对您有所帮助。

请将以下代码写入您的 .Htaccess 文件中并进行检查:

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

希望这能帮到您!


3
您可以使用内置函数 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
?>

请注意,如果文件不存在,该函数将返回错误。
以下是来自文档的一些重要备注:

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

并且

在Windows下,realpath()将更改Unix样式的路径为Windows样式。


1
它用DIRECTORY_SEPARATOR替换/(连续)和\的出现,并且可以正确处理/.和/..。由get_absolute_path()返回的路径在字符串开头(位置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'));

返回:字符串(14) "this/a/test/is"


0

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

这段代码将双斜杠替换为单斜杠,只要它改变了长度。


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