相対パスから絶対パスURLを作成

Pocket

相対パスから絶対パスのURLを作りたい場合って、ありますよね

今回、「.. や 「.」 が入った相対パスから絶対パスURLを作成する必要があり、関数を作りました。

最初に参考にしたのは MB.blog さんの

PHPで相対パスから絶対URL(URI)を作成する

という記事。

ただし、「.. や 「.」 の対応はないので、その機能を追加しました

間違っていたら、教えてください

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

コメントを残す