相対パスを解釈する

“/pc/.././sp”成るパスがあり、これを”/sp”という風に、相対パスの結果を取得したかった。

色々調べてみたものの、PHPのライブラリにもPEARにもPECLにも無かったようだ。

結局のところ下記のソースに修正を加えて実現できた。
ありがたや~

■参考ソースサイト
http://www.crystal-creation.com/web-appli/technical-information/programming/php/network/

以下、改修後のソース

$path = ‘/sp/.././pc’;

$info = parse_url( $path );

var_dump( RelToAbs( ‘/’, $path ) );

function RelToAbs( $baseUrl, $url )
{
if( $url == ” ) return $baseUrl;

// すでに絶対URLならば、それを返す
if( parse_url( $url, PHP_URL_SCHEME ) != NULL ) return $url;

// ベースURLをパースする
$parsedUrl = parse_url( $baseUrl );
$path = ”;
if( isset($parsedUrl[ ‘path’ ]) ) $path = $parsedUrl[ ‘path’ ];

if( $url[ 0 ] == ‘/’ ) {
// URLがルートからの相対ならば、パスを削除する
$path = ”;
}
else if( $url[ 0 ] != ‘#’ && $url[ 0 ] != ‘?’ ) {
// パスからディレクトリ以外を削除
$path = preg_replace( ‘#/[^/]*$#’, ”, $path ).’/’;
}
$path .= $url;

// ‘//’、’/./’または’/foo/../’ならば、’/’に置換する
$pattern = array( ‘#/\.?/#’, ‘#/(?!\.\.)[^/]+/\.\./#’ );
do{
$path = preg_replace( $pattern, ‘/’, $path, -1, $count );
} while( 0 < $count );

//return $parsedUrl[ ‘scheme’ ].’://’.$parsedUrl[ ‘host’ ].$path;
return $path;
}