$path = '/home/to//my///site';
我正在尝试/
从上面的路径中删除不必要的正斜杠
我试图得到这个结果
/home/to/my/site
我失败了str_replace
,因为我不知道斜线的数量。
$path = '/home/to//my///site';
我正在尝试/
从上面的路径中删除不必要的正斜杠
我试图得到这个结果
/home/to/my/site
我失败了str_replace
,因为我不知道斜线的数量。
您可以通过preg_replace
一行代码获得它:
preg_replace('#/+#','/',$str);
该模式/+
将匹配正斜杠/
一次或多次,并将其替换为单个/
.
当然还有其他方法可以实现这一点,例如使用while
循环。
while( strpos($path, '//') !== false ) {
$path = str_replace('//','/',$path);
}
这将调用str_replace
直到所有出现的//
都被替换。如果您想牺牲可读性(不建议),您也可以在一行代码中编写该循环。
while( strpos( ($path=str_replace('//','/',$path)), '//' ) !== false );
如果有人想从 URL 中删除多余的斜杠而不删除 http/https 之后的前两个斜杠:
$url = preg_replace('/([^:])(\/{2,})/', '$1/', $url);
(感谢 ツ Liverbool 如何使用 'PREG' 或 'HTACCESS' 删除 URI 中的多个斜杠)
您好,这可能会有所帮助
将此代码写入您的 .Htaccess 文件并检查它..
# Prevent double slashes in URLs, e.g. //Blog and /Home//About
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
希望对您有所帮助!
您可以使用内置函数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 样式。
它用 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"
while(strlen($path) != (strlen($path = str_replace('//','/', $path))));
这段代码用单斜杠替换双斜杠,只要它改变长度;