本文操作环境:Windows7系统、PHP7.4版、DELL G3电脑
php 怎么转换成绝对路径?
PHP 相对路径转换为绝对路径 realpath
* 相对路径 -> 绝对路径 realpath
<?php
define('PATH_MAX', 255);
function sub_rel2abs(string $in_rel, string &$out_abs) {
$i_rtn = 0; // return value
$ss_rel = ""; // for relative path build
$st_fpos = 0; // front separator index
$sv_path = []; // pide path to array
$st_pos = strpos($in_rel, DIRECTORY_SEPARATOR);
$npos = 0;
while ($npos != $st_pos) {
if ($st_pos != 0) {
array_push($sv_path, substr($in_rel, $st_fpos, $st_pos - $st_fpos));
}
// next...
$st_fpos = $st_pos; // set current pos to last pos
$st_pos++; // from next index
$st_pos = strpos($in_rel, DIRECTORY_SEPARATOR, $st_pos); // next separator index
} // while ( $npos != $st_pos )
// final separator
array_push($sv_path, substr($in_rel, $st_fpos));
$lpc = 0; // loop count
$i_max = count($sv_path);
while ($lpc < $i_max && 0 === $i_rtn) {
$ss_rel .= $sv_path[$lpc];
// relative path => relative path
$c_abs = realpath($ss_rel);
if ($c_abs === false) {
$i_rtn = -1;
} else {
$ss_rel = $c_abs;
$i_rtn = 0;
}
$lpc++;
} // while (count($sv_path)>0)
// normal ending
if (0===$i_rtn) {
$out_abs = $ss_rel; // set converted path
}
return $i_rtn;
}
// test
$inDir = "/Users/Mch/Code/php/Directory";
is_dir($inDir) || mkdir($inDir, 0777, true);
$wd = __DIR__;
chdir($inDir);
$out = "";
echo sub_rel2abs("../../../eclipse-workspace/blog.zip", $out).PHP_EOL;
echo $out.PHP_EOL;
chdir($wd);
@rmdir($inDir);
output:
0
/Users/Mch/eclipse-workspace/blog.zip
这里直接realpath就可以了,为什么多此一举?
* 绝对路径 -> 相对路径
<?php
function abs2rel(string $base, string $path) {
if (is_dir($base)) {
$base = rtrim($base, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . ".";
}
$a = explode(DIRECTORY_SEPARATOR, $base);
$b = explode(DIRECTORY_SEPARATOR, $path);
$d = []; // $path push
$i = count($a)-1;
$sliceEquals = function($a, $b, $j) {
if ($j >= count($a) || $j >= count($b)) {
throw new Exception('$j out of range');
}
for ($i = $j; $i >= 0; $i--) {
if (strcmp($b[$i], $a[$i])!==0) {
return false;
}
}
return true;
};
// 找到a,b数组元素相同的下标
while (array_pop($a)) {
$i = count($a)-1;
if (isset($b[$i])) {
if ($sliceEquals($a, $b, $i)) {
break;
}
}
array_push($d, "..");
}
// 从首个不同元素开始
for ($i+=1; $i < count($b); $i++) {
array_push($d, $b[$i]);
}
return ".".DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $d);
}