【PHP】リンク先URLとそのページの相対パスを入れると絶対URLにして返してくれる関数がほしかった

この記事は最新更新日から、6年以上経過しています。

概要

phpでスクレイピングしたリンク先のサムネイルのsrcが相対パスだった。
なんとかして絶対パスに変換しないといけなかったので関数を作りました。
なんかぐぐっても見つけられなかったんですよね…。

コード

// リモートの相対パスを絶対URLにする
function return_absolute_url( $main_url, $path ) {
	$path_str     = explode( '/', $path );
	$url_str      = explode( '/', $main_url );
	$up_count     = 0;
	$absolute_uri = $path;

	if ( strpos( $path, '..' ) !== false ) {
		//上に上がる階層数を確認
		foreach ( $path_str as $val ) {
			if ( $val === '..' ) {
				$up_count++;
			}
		}
		$absolute_url  = array();
		$absolute_path = array();

		// ../のぶんだけ改装を記録しない
		for ( $i = count( $url_str ) - $up_count - 2; $i >= 0; $i-- ) {
			array_unshift( $absolute_url, $url_str[ $i ] );
		}

		// ../を記録しない
		for ( $t = $up_count; $t < count( $path_str ); $t++ ) {
			array_push( $absolute_path, $path_str[ $t ] );
		}
		// まとめる
		$absolute_uri = implode( '/', $absolute_url ) . '/' . implode( '/', $absolute_path );
	}

	// スラッシュ始まりパス用
	if ( preg_match ( '/^\/[^\/]/i', $path , $aa) === 1 ) {
		$http         = $url_str[0] . '/' . $url_str[1] . '/' . $url_str[2];
		$absolute_uri = $http . $path;
	}

	//リンク先実在確認(不要なら外す)
	$response = @file_get_contents($absolute_uri);
	if ($response === false) {
		$absolute_uri = null;
	}

	return $absolute_uri;
}

実行例

※URLは架空のものです

$main_url = 'http://noarts.net/hp/start/page/test.html';
$path = '../../test_img.jpg';
echo return_absolute_url($main_url,$path);
/*
http://noarts.net/hp/test_img.jpg
*/

まとめ

特にエラー処理してないのでなんか変なURLだと変なURLが出ますが目的は達成した…。