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

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

我试图得到这个结果

/home/to/my/site

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

4

6 回答 6

33

优雅的解决方案

您可以通过preg_replace一行代码获得它:

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

该模式/+将匹配正斜杠/一次或多次,并将其替换为单个/.

不太优雅的解决方案

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

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

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

while( strpos( ($path=str_replace('//','/',$path)), '//' ) !== false );
于 2012-09-19T12:17:44.440 回答
12

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

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

(感谢 ツ Liverbool 如何使用 'PREG' 或 'HTACCESS' 删除 URI 中的多个斜杠

于 2015-04-15T10:16:44.343 回答
4

您好,这可能会有所帮助

将此代码写入您的 .Htaccess 文件并检查它..

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

希望对您有所帮助!

于 2012-09-19T12:38:22.117 回答
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
?>

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

文档中的一些重要评论:

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

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

于 2016-01-15T13:10:15.363 回答
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"

于 2016-04-21T07:31:57.933 回答
0

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

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

于 2016-02-17T16:17:07.190 回答