$path = '/home/to//my///site';
我正在尝试从上面的路径中删除不必要的正斜杠/
我想要得到这个结果
/home/to/my/site
我用str_replace
失败了,因为我不知道斜杠的数量。
答案 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"