相対パスから絶対パスのURLを作りたい場合って、ありますよね
今回、「..」 や 「.」 が入った相対パスから絶対パスURLを作成する必要があり、関数を作りました。
最初に参考にしたのは MB.blog さんの
という記事。
ただし、「..」 や 「.」 の対応はないので、その機能を追加しました
間違っていたら、教えてください
function make_uri($base='', $rel_path='') { $base = chop($base); $rel_path = chop($rel_path); $parse=array(); $parse=parse_url($base); if (preg_match('/^https\:\/\//',$rel_path) ){ return $rel_path; } elseif (preg_match('/^http\:\/\//',$rel_path) ){ return $rel_path; } elseif ( preg_match('/^\/.+$/', $rel_path) ){ return $parse['scheme'].'://'.$parse['host'].$rel_path; } elseif ( preg_match('/^\//', $rel_path)){ return $parse['scheme'].'://'.$parse['host'].$rel_path; } elseif ( strchr($rel_path, "/") === FALSE) { $a = strrchr($parse['path'], '/'); // $a の最後が / で終わっていた場合 if ( strlen($a) === 1) return $parse['scheme'] . '://' . $parse['host'] . $parse['path'] . $rel_path; $b = substr($parse['path'], 0, -strlen($a)+1); return $parse['scheme'].'://'.$parse['host'].$b.$rel_path; } else { $a=split('/',$parse['path']); if ( substr($parse['path'],-1) != "/") array_pop($a); $b=split('/',$rel_path); foreach ($b as $v) { if ($v=='.'){} elseif($v=='..') { array_pop($a); } else { array_push($a,$v); } } $path=join('/',$a); return $parse['scheme'] . "://" . $parse['host'] . $path; } }