/**
* @param $dirPath
* @return string
*/
function dirPathFormat($dirPath)
{
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $dirPath);
//过滤掉多个/ 的 比如a/c//d
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
//首个路径不用管,可能是'', '..', '.', '其他'
$first = array_shift($parts);
$path = [];
foreach ($parts as $part) {
if ($part === '.') {
//一个点代表当前路径不用处理
continue;
} elseif ($part === '..' && end($path) !== false && end($path) !== '..') {
//这里有可能前面有几个双点 比如 ../../../a/b/c
array_pop($path);
} else {
$path[] = $part;
}
}
array_unshift($path, $first);
return implode(DIRECTORY_SEPARATOR, $path);
}
var_dump(dirPathFormat('/a/d/.././f/1.jpg'));
var_dump(dirPathFormat('../../../c/d/../../../../f/1.jpg'));
运行结果
string(10) "/a/f/1.jpg"
string(22) "../../../../../f/1.jpg"