“/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;
}