Im PHP-Manual gibt es
diverse Lösungsansätze in den Kommentaren unter der Funktion realpath().
Hier eine weitere Variante.
<?php
$test = array(
'a/../index.html',
'../index.html',
'../../index.html',
'a/../b/../c/d/../e/../../f/index.html',
'a/b/../c/d/../../../../index.html',
'..//./../dir4//./dir5/dir6/..//dir7/',
'a/b/../c/d/index.html',
'a/b/../../c/d/index.html',
'a/b/../../c/../d/index.html',
'../../downloads/bar/../foo/../index.html',
'downloads/../../../',
);
function canonicalPath($url)
{
$dirs = explode('/', $url);
$n = 0;
$stack = array();
$leading = '';
foreach ($dirs as $s):
if ($s == '.' || $s == ''){
continue;
}
if ($s == '..'){
if (count($stack)){
array_pop($stack);
}else{
$leading .= '../';
}
continue;
}
array_push($stack, $s);
endforeach;
$url = $leading.join ('/', $stack);
return $url;
}
foreach ($test as $t){
printf ('<strong>%s</strong> => <strong>%s</strong><br>',
$t,
canonicalPath($t)
);
}
?>