パスからディファクトリ名、ファイル名、拡張子を取り出す方法 - pathinfo
ファイル名を受け取って、そこから拡張子を取り出す、ディレクトリ名を取り出す・・・というような作業は時々必要になりますよね。
C# では System.IO の Path.GetExtension メソッドが使えたりします。
では PHP ではどうすればよいでしょうか。
パス名からドット (.) を探して、ドットより後ろを取り出すというようなことを本当にやらないといけないのでしょうか。
もしその方向で実装するとしたら、ファイル名と拡張子の区切りはドットでいいでしょう。
では、ディレクトリ名を取り出すならどうでしょうか。
パス名の区切りは環境によって異なります。
UNIX/Linux ではスラッシュで区切ればよいでしょうか。Windows ならバックスラッシュで区切りましょうか・・・あ、でもそれじゃ現在実行中のプラットフォームを識別する方法はどうしたらよいでしょうか・・・
意外と環境の違いを吸収するのは簡単ではありません。
このように、クロスプラットフォームで動作可能なプログラムを開発する際には、なるべく自前で関数を作ることは避けていく方が望ましいです。
特にパス名の展開のような基本作業は、信頼のおけるライブラリやビルトインの関数を使うようにしましょう。
さて、前置きが長くなりましたが、ここでは PHP でパス名を調べる方法を紹介します。
パス名から、ディレクトリ名、ファイル名、拡張子の情報を抜き出すには、pathinfo 関数を使います。
pathinfo にパス名を渡すと、それぞれの情報を格納した配列を返してくれます。もし、拡張子の情報だけが必要だ、というような場合は、 pathinfo の第二引数に PATHINFO_EXTENSION を指定すると、いろいろな情報を含む配列の変わりに欲しい情報だけの文字列が返ります。
PATHINFO_EXTENSION の他、ディレクトリ名を返すための PATHINFO_DIRNAME、拡張子無しファイル名を取得するための PATHINFO_BASENAME、 拡張子付きのファイル名を取得するための PATHINFO_FILENAME が定義されています。
では、早速次のコードの実行例を見てみましょう。
<?php
header("Content-Type: text/plain");
$p = 'C:\dir\subdir\filename.txt';
$i = pathinfo($p);
show_result($p, $i);
$p = '/dir/subdir/filename.txt';
$i = pathinfo($p);
show_result($p, $i);
$i = pathinfo($p, PATHINFO_EXTENSION);
show_result($p, $i);
$p = '/dir/subdir/abc';
$i = pathinfo($p);
show_result($p, $i);
$i = pathinfo($p, PATHINFO_EXTENSION);
show_result($p, $i);
function show_result($p, $i){
echo "-----------------------\n";
echo "path = $p\n";
var_dump($i);
}
?>
この結果は次のようになります。
----------------------- path = C:\dir\subdir\filename.txt array(4) { ["dirname"]=> string(13) "C:\dir\subdir" ["basename"]=> string(12) "filename.txt" ["extension"]=> string(3) "txt" ["filename"]=> string(8) "filename" } ----------------------- path = /dir/subdir/filename.txt array(4) { ["dirname"]=> string(11) "/dir/subdir" ["basename"]=> string(12) "filename.txt" ["extension"]=> string(3) "txt" ["filename"]=> string(8) "filename" } ----------------------- path = /dir/subdir/filename.txt string(3) "txt" ----------------------- path = /dir/subdir/abc array(3) { ["dirname"]=> string(11) "/dir/subdir" ["basename"]=> string(3) "abc" ["filename"]=> string(3) "abc" } ----------------------- path = /dir/subdir/abc string(0) ""
面白いのは最後の二つのテストでしょうか。
パス名として拡張子抜きの /dir/subdir/abc を渡すと、pathinfo の戻り値の配列中には "extension" のエントリーが存在しません。 しかし、PATHINFO_EXTENSION を指定して pathinfo を呼んだ場合は、存在しない (null) とするのではなく、"" として返ってきます。
拡張子を取る際には PATHINFO_EXTENSION をはじめから使ったほうが、null だ "" だと型が分かれなくて良さそうですね。