かずブログ

Orange Tiny Terror
ひたすら弾くだけ! ギター・トレーニング
地獄のメカニカル・トレーニング・フレーズ 暴走するクラシック名曲編
HERCULES GS432B
冒険野郎マクガイバー シーズン1〈日本語完全版〉
冒険野郎マクガイバー シーズン2〈日本語完全版〉
冒険野郎マクガイバー シーズン3〈日本語完全版〉
Destination (通常盤)
circus (DVD付)
SanDisk UltraII メモリースティックPRO Duo 4GB 転送速度15MB/Sec SDMSPDH-004G-J61
SanDisk microSD Memory Kit 2GB SDSDQ-2048-J3K

相対パスを得るスクリプト

PHPで相対パスを得るスクリプトを作ったので、ここにメモします。
現在、HPをフレームを使うのをやめてPHPで動作するように書き換えており、一つのメニュー定義ファイルでサブディレクトリから呼び出してもリンクの相対パスがおかしくならないようにする目的で作りました。

ルートディレクトリに「menu.php」があり、サブディレクトリへのリンクが貼ってあったとします。
例)./test/test.html
このmenu.phpをルートディレクトリのファイル(index.php等)からincludeすれば問題ありませんが、サブディレクトリのファイルからincludeしたい場合はパスが異なってしまいます。
例)../test/test.html

この「../」の部分を自動的に「./」にしたり「../../」としたりするスクリプトです。


$adjust = 1;
$dir = "";
$num = count( preg_split( "/\//", $_SERVER["PHP_SELF"] ) );
$num--;
$num -= $adjust;

if( $num <= 1 ){
$dir = "./";
}
else{
while( $num > 1 ){
$dir = $dir."../";
$num--;
}
}
?>


これを
製品レビュー
このように「」で呼び出します。
このスクリプトを定義したファイルをincludeすれば、どこから呼び出しても相対パスが正常に指定できるようになります。

ただし、環境によって一箇所変更する必要があります。
「$adjust = 1;」の「1」です。
自分のHPのURLに、ユーザー名が入っている人は1にしてください。
例)http://〜.com/~○○/index.php
入っていない人は0にしてください。
例)http://〜.com/index.php
また、ユーザー名が入っていてindex.phpがサブディレクトリに入っている人は2にしてください。
例)http://〜.com/~○○/test/index.php
サブディレクトリが2階層の場合は3です。
例)http://〜.com/~○○/test/aaa/index.php

要は、ドメイン名(.comとか.jpの部分)とindex.phpの間にいくつディレクトリが入っているかを入れればいいだけです。
index.phpは、上記スクリプトを呼び出す際に、トップになるページです。
「ユーザー名がない場合」のケースは、独自ドメインサービスを利用していないので実際のWebサーバでは未確認です。
ローカルのhttpサーバでは確認しました。

リンク先をhttpからの絶対パスで指定してしまうと、新しいページを作ってローカル環境で試すときなどに、サーバーにアクセスしに行ってしまってうまくいきません。
よかったら使ってみてください。簡単なスクリプトですが、一応各処理の説明も下に入れておきます。
php5.0.5で確認しましたが、動かなかったらごめんなさい。


$adjust = 1;
// index.phpの位置による調整
$dir = "";
// パス保存用
$num = count( preg_split( "/\//", $_SERVER["PHP_SELF"] ) );
/* ディレクトリの個数を得る。
「$_SERVER["PHP_SELF"]」で、例えば上記製品レビューのページに
いるとき、ユーザー名がない場合は「/review/review.php」が返ってくる。
これを「/」で分割し、その結果の配列の個数をcountで数える。 */
$num--;
/* 「/review/review.php」の場合3が返ってくるため、一つ減らす。
おそらく、「@/Areview/Breview.php」というカウントなのかと思う。 */
$num -= $adjust;
//* index.htmlの位置による微調整

if( $num <= 1 ){ /* 個数が1以下の場合はルートにいることになる。
ルートにいる場合は「/index.php」と返ってくる。 */
$dir = "./"; // ルートの場合は「./」を設定
}
else{ // ルート以外の場合
while( $num > 1 ){ // ディレクトリ数が1になるまでループ
$dir = $dir."../"; // 「../」を付け加えていく
$num--; // ディレクトリ数-1
}
}
?>


PHPなんてまったく使ったことないし、正規表現もぜんぜん使わないので調べて作るのにえらい時間がかかってしまいました。

2011/05/05 追記:
phpのバージョンが変わってから、前の呼び出し方ではダメになったようです。
しらべたところ、
<a href="<? echo("$dir");?>review/review.php">製品レビュー</a>
のような感じで呼べば良いようでした。

2005/10/23(Sun) 01:21:05 [50] かず

投稿パス:

名前:  題名:


パスワード: 

Next >> [HPの引っ越し]
Back >> [Google AdSense]