ディレクトリ名の取得とその応用(PHPのexplode関数を使用)
表示させるウェブページのディレクトリ(フォルダ)名をPHPで取得したいことがあります。これができれば、PHPスクリプトを簡単にしたり、ファイル数を減らしたりできます。私はPHPで取得したディレクトリ名を使ってデザイン変更やアクセス解析のログファイル名に使用してみました。
PHPを使ってファイルのディレクトリ名を取得します
![サーバーの写真](img/server.jpg)
文字列を区切り文字で分割するには、普通はsplit()関数を使います。しかし、split()関数はPHP 5.3.0 で非推奨になったらしい。
私は、代わりにexplode()関数を使うことにしました。この方が動作が速いようです。
PHPの explode() 関数の使い方
explode() の機能は文字列を区切り文字($delimiter)で分割した文字列の 配列楽天 を返すものです。
explode($delimiter,$string[,limit])
この配列の各要素は、元の文字列($string)を文字列($delimiter)で区切った、部分文字列になります。
limitに正の値が指定された場合の、返される配列は、最大limit数の要素になり、その最後の要素には$stringの残りの部分が全て含まれます。
もし、limitが負の場合は、後ろからlimit個の要素を削除して、他の全ての要素が返されます。(Ver.5.1.0より)
PHPの explode() 関数を使ってファイルのディレクトリ(フォルダ)名を取得します
<?php $s_name=$_SERVER['SCRIPT_NAME']; $dir_a=explode("/",$s_name,-1); ?>
この例では、$_SERVER['SCRIPT_NAME']は、サーバーのドメイン名の後ろのパスとファイル名を表しています。例えばhoge.jp/dir1/dir2/example.phpなら/dir1/dir2/example.phpを表しています。
そこで、PHPの explode() 関数を使ってファイルのディレクトリ名に分解します。この中のディレクトリ(フォルダ)名「dir1」を取り出すのなら「$dir_a[1]」とします。この中の「dir2」を取り出すのなら「$dir_a[2]」とします。
「$limit」が「-1」になっているのは、最後の文字列がファイル名なのでこれを削除する為です。この「-1」は、今回の場合は無くても動作に影響しません。
「$_SERVER['SCRIPT_NAME']」を直接explode()で処理しようとするとエラーとなります。だから、あらかじめ、「$_SERVER['SCRIPT_NAME']」を「$s_name」に代入しています。
あるカテゴリーページのデザイン変更に応用した例
次のように取得したディレクトリ名を使って、あるカテゴリーのページのみデザインを変更してみました。私のサイトはカテゴリー毎にディレクトリーが違っているのを応用しています。
<?php if (!($dir_a[1] == "**1" || $dir_a[1] == "**2")) { ?> ディレクトリ名が「**1」または「**2」以外の時に動作させるHTMLタグをそのまま記述 <?php } else { ?> ディレクトリ名が「***1」または「***2」の時に動作させるHTMLタグをそのまま記述 <?php } ?>
if動作の否定と、or条件を同時に設定しています。
取得したディレクトリ名をアクセス解析のログファイル名に適用した例
有限工房のfstatというアクセス解析の、解析ページに付けるスクリプトは次のようなものです。これを各ファイルのボディタグ内に記述します。これを外部ファイルにして、PHPでインクルードして呼び出しています。
私のウェブサイトはジャンル毎にディレクトリ(フォルダ)を分けていて、アクセス解析もディレクトリ毎に行なっています。この方法は、PHPの explode() 関数を使ってファイルのディレクトリを取得して、ログファイル名に変換するのにとても好都合なのです。
下記のスクリプトで、ログファイル名は「<?php echo $dir_a[1]; ?>」で置き換えています。ちなみに「<?php echo $dir_a[0]; ?>」は、最初の「/」より前なので何もありません。
<?php $s_name=$_SERVER['SCRIPT_NAME']; $dir_a=explode("/",$s_name,-1); ?> <script type="text/javascript"> <!-- buf = escape(parent.document.referrer); ref = ""; for (i = 0; i < buf.length; i++) { str = buf.charAt(i); ref += (str == "+") ? "%2B" : str; } scr = screen.width+","+screen.height+","+screen.colorDepth; document.write('<img SRC="http://hogehoge.jp/***/***/hoge.cgi?LOG=<?php echo $dir_a[1]; ?> />'); // --> </script> <noscript><img src="http://hogehoge.jp/***/***/hoge.cgi?LOG=<?php echo $dir_a[1]; ?>" /></noscript>
取得したディレクトリ名をアクセス解析のログファイル名に適用すると、今までログファイル名ごとに必要だったファイルが、ひとつで済むようになりました。つまり各ジャンル毎に必要だったインクルードファイル(約20個)が1個になりました。
ページのキーワードを使って楽天広告スクリプトを自動生成した例
次に、PHPの explode() 関数を使った別の応用例を紹介します。私は、ウェブページのキーワード群をPHPを使って文字列に登録して、メタタグのキーワードとして取得して使っています。
このキーワード群の中から1個のキーワードをPHPの explode() 関数を使って取得して、楽天アフィリエイト広告のスクリプトを自動的に生成させてみました。
この方法だと、各ページでキーワードが異なっているので、生成されたコードも各ページ別々のものとなります。また、各ページで最適な広告が出ますので、効果が大きいと思われます。グーグルアドセンスのリンクユニットに似ています。各ページのコンテンツにマッチした広告となります。