wordpressを使ってて思うのが、サイトurlを変更したり、
cssやjs・画像ファイルをwordpressのインストールディレクトリとは
別にした時、ソース上のパスが相対パスの嵐になってしまうので、
それを正規化するフィルターを一本ゴリ押しで書いてみた。
<?php
// 適当にパスを突っ込む
$real = 'http://hoge.jp/install_dir/wp-admin/wp-content/../../../css/test/../test.css?aaa=bbb&amp;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;
}
?>

