<p>PHP中计算相对路径的代码</p><pre class="brush:php;toolbar:false">functiontransfer($apa,$apb,&$rpa,&$rpb)
{
$apa=str_replace('\\','/',$apa);//把\预处理为/
$apb=str_replace('\\','/',$apb);
//对于某一个串为空串或者只含有一个/或者\
if($apa==''||$apb==''||$apa=='/'||
$apb=='/'||$apa=='\\'||$apb=='\\')
returnfalse;
$apa_arr=explode('/',trim($apa,'/'));
$apb_arr=explode('/',trim($apb,'/'));
$al=count($apa_arr);
$bl=count($apb_arr);
$i=0;
while(true)
{
if($i>=$al||$i>=$bl)
{
break;
}
if($apa_arr[$i]!=$apb_arr[$i])
{
break;
}
$i++;
}
$rpa='';
$rpb='';
for($j=$i;$j<$al-1;$j++)
{
$rpb.='../';
$rpa.=$apa_arr[$j].'/';
}
for($j=$i;$j<$bl-1;$j++)
{
$rpa='../'.$rpa;
$rpb.=$apb_arr[$j].'/';
}
$rpa.=$apa_arr[$al-1];
$rpb.=$apb_arr[$bl-1];
returntrue;
}</pre><p>使用样例进行测试:</p><p>分别为:</p><p>1、两个路径中其中一个为空串</p><p>2、两个路径在不同的目录下</p><p>3、两个路径在同一目录下</p><p>4、其中一个路径的父路径和另一条路径在同一目录下</p><p>测试程序:</p><pre class="brush:php;toolbar:false"><?php
echo"绝对路径to相对路径:<br/>";
functiontransfer($apa,$apb,&$rpa,&$rpb)
{
$apa=str_replace('\\','/',$apa);//把\预处理为/
$apb=str_replace('\\','/',$apb);
//对于某一个串为空串或者只含有一个/或者\
if($apa==''||$apb==''||$apa=='/'||
$apb=='/'||$apa=='\\'||$apb=='\\')
returnfalse;
$apa_arr=explode('/',trim($apa,'/'));
$apb_arr=explode('/',trim($apb,'/'));
$al=count($apa_arr);
$bl=count($apb_arr);
$i=0;
while(true)
{
if($i>=$al||$i>=$bl)
{
break;
}
if($apa_arr[$i]!=$apb_arr[$i])
{
break;
}
$i++;
}
$rpa='';
$rpb='';
for($j=$i;$j<$al-1;$j++)
{
$rpb.='../';
$rpa.=$apa_arr[$j].'/';
}
for($j=$i;$j<$bl-1;$j++)
{
$rpa='../'.$rpa;
$rpb.=$apb_arr[$j].'/';
}
$rpa.=$apa_arr[$al-1];
$rpb.=$apb_arr[$bl-1];
returntrue;
}
functionoutput($apa,$apb)
{
echo"串a:$apa<br/>串b:$apb<br/>";
if(transfer($apa,$apb,$a,$b))
echo'a相对于b的路径:'.$a.'<br/>b相对于a的路径:'.$b.'<br/>';
else
echo'不存在相对路径';
echo'<br/><br/>';
}
output('/home/web/test/a.php','');
output('/home/web/test/a.php','/home/data/d.png');
output('/home/web/test/a.php','/home/web/test/d.png');
output('/home/web/test/myyy/a.php','/home/web/test/d.png');
?>
结果:
绝对路径to相对路径:
串a:/home/web/test/a.php
串b:
不存在相对路径
串a:/home/web/test/a.php
串b:/home/data/d.png
a相对于b的路径:../web/test/a.php
b相对于a的路径:../../data/d.png
串a:/home/web/test/a.php
串b:/home/web/test/d.png
a相对于b的路径:a.php
b相对于a的路径:d.png
串a:/home/web/test/myyy/a.php
串b:/home/web/test/d.png
a相对于b的路径:myyy/a.php
b相对于a的路径:../d.png</pre>