wordpressを使ってて思うのが、サイトurlを変更したり、
cssやjs・画像ファイルをwordpressのインストールディレクトリとは
別にした時、ソース上のパスが相対パスの嵐になってしまうので、
それを正規化するフィルターを一本ゴリ押しで書いてみた。
<?php // 適当にパスを突っ込む $real = 'http://hoge.jp/install_dir/wp-admin/wp-content/../../../css/test/../test.css?aaa=bbb&amp;ccc=ddd#flag'; var_dump(opt_path($real)); // パスを正規化(http(s)://から始まる絶対パスのみ) function opt_path($base=''){ // urlパース $parse = parse_url($base); // schemeに合わなければ何もしない if (!preg_match('/^https?\:\/\//',$base) ){ return $base; } // パスを/で区切る $tmp = split('\/',$parse['path']); // 配列を定義 $dirs = array(); foreach($tmp as $pt){ // 親ディレクトリの場合は前に積んだディレクトリをはずす if($pt == '..'){ array_pop($dirs); }else if($pt == '.'){ // カレントの場合は何もしない continue; }else{ // それ以外はディレクトリ名として突っ込む //(隠しディレクトリもいけると思うけど無対応) array_push($dirs,$pt); } } // url組み立て開始 $urls = $parse['scheme'] . '://' . $parse['host'] . implode('/',$dirs); // クエリがあれば付加 if($parse['query']){ $urls = $urls . '?' . $parse['query']; } // フラグメントがあれば付加 if($parse['fragment']){ $urls = $urls . '#' . $parse['fragment']; } return $urls; } ?>
コメント