WebDesign Dackel

PHP 相対パスから完全URLを取得する

PHP 相対パスから完全URLを取得する

Hatena0
Google+0
Pocket0
Feedly0

今日は久しぶりにPHPネタです。
普段あまり使う機会はなかったのですがこの前仕事で、相対パスをhttpから始まる絶対パスへと変換する必要がありました。
どういうことかといいますと、下記の結果が欲しかったわけです。

http://localhost/path/info/../../
↓
http://localhost/

PHP標準には相対パスから絶対パスへ変換する関数は無い

PHPにはrealpath()という便利な関数があるし、パスだけじゃなくてURLの変換もしてくれるものがあるだろうと何となく期待していたのですが、そんな関数はありませんでした。

しかし、そのものズバリでいい感じに実装をしている方がいたのでそのまま使用させていただきました。

PHPで相対パスから絶対URL(URI)を作成する | anoncom blog
ANONCOM BLOG さんありがとうございますっ!

実際の関数は下記の様な感じです。

/**
 * createUri
 * 相対パスから絶対URLを返します
 *
 * @param string $base ベースURL(絶対URL)
 * @param string $relational_path 相対パス
 * @return string 相対パスの絶対URL
 * @link http://blog.anoncom.net/2010/01/08/295.html/comment-page-1
 */
function createUri( $base, $relationalPath )
{
     $parse = array(
          "scheme" => null,
          "user" => null,
          "pass" => null,
          "host" => null,
          "port" => null,
          "query" => null,
          "fragment" => null
     );
     $parse = parse_url( $base );

     if( strpos($parse["path"], "/", (strlen($parse["path"])-1)) !== false ){
          $parse["path"] .= ".";
     }

     if( preg_match("#^https?://#", $relationalPath) ){
          return $relationalPath;
     }else if( preg_match("#^/.*$#", $relationalPath) ){
          return $parse["scheme"] . "://" . $parse["host"] . $relationalPath;
     }else{
          $basePath = explode("/", dirname($parse["path"]));
          $relPath = explode("/", $relationalPath);
          foreach( $relPath as $relDirName ){
               if( $relDirName == "." ){
                    array_shift( $basePath );
                    array_unshift( $basePath, "" );
               }else if( $relDirName == ".." ){
                    array_pop( $basePath );
                    if( count($basePath) == 0 ){
                         $basePath = array("");
                    }
               }else{
                    array_push($basePath, $relDirName);
               }
          }
          $path = implode("/", $basePath);
          return $parse["scheme"] . "://" . $parse["host"] . $path;
     }

}

内容としてはベースのURLをparse_url()にかけて取得した結果を調整する、という具合です。

そして、上記のcreateUri()関数を使うことで期待する値が返ってきました。

$uri = "http://localhost/path/info/";
print "変換前 : {$uri}n";

$uri = createUri($uri, "../../");
print "変換後 : {$uri}";

// ↓ 実行結果
// 変換前 : http://localhost/path/info/
// 変換後 : http://localhost/

たまにしか使わないようなことなので忘れてしまわないように、という自分へのメモでした。