2008年5月1日木曜日

 

【PHP】ファイルパス操作

ファイルパスから拡張子を調べたり、画像や動画の変換をする場合に拡張子より前、「.(ドット)」までをファイル名から取得したい場合などの為のメモ。

 // テストパス
array(
    '/www/htdocs/index.html',
    '/ドキュメント/data-4.xml',
    'c:/aaa/bbb/usr/あああ/aaa/新しい.かも.txt'
    )

その1 pathinfo() 関数

pathinfo - PHP マニュアル

pathinfo  ( string $path  [, int $options  ] )
$options で必要なものだけ取得できる
指定可能な引数は PATHINFO_DIRNAMEPATHINFO_BASENAMEPATHINFO_EXTENSION、PHP 5.2.0 以降でPATHINFO_FILENAME
// 返り値
array() {
    ["dirname"],    // ディレクトリパス
    ["basename"], // ファイル名
    ["extension"],  // 拡張子
    ['filename']     //  ファイル名(拡張なし) ※PHP 5.2.0 以降
}
// テスト
foreach ($array as $path) {
    var_dump(pathinfo($path));
}
// 実行結果
array(3) {
    ["dirname"]=>  string(11) "/www/htdocs"
    ["basename"]=>  string(10) "index.html"
    ["extension"]=>  string(4) "html"
} 
array(3) {
     ["dirname"]=>  string(13) "/ドキュメント"
     ["basename"]=>  string(10) "data-4.xml"
     ["extension"]=>  string(3) "xml"
}
array(3) {
    ["dirname"]=> string(25) "c:/aaa/bbb/usr/あああ/aaa"
    ["basename"]=> string(14) "Vしい.かも.txt"
    ["extension"]=> string(3) "txt"
}

その2 explode() 関数でパスを分解

explode  ( string $delimiter  , string $string  [, int $limit  ] )
$string を文字列 $delimiter で区切った配列を返す
$limit は分割の上限
// テスト
foreach ($array as $path) {
    print_r(explode('/', $path));
}
// 実行結果
Array (
    [0] =>
    [1] => www
    [2] => htdocs
    [3] => index.html
)
Array (
    [0] =>
    [1] => ドキュメント
    [2] => data-4.xml
)
Array (
    [0] => c:
    [1] => aaa
    [2] => bbb
    [3] => usr
    [4] => あああ
    [5] => aaa
    [6] => 新しい.かも.txt
)

その3 strrpos() 関数で拡張子なしファイル名の取得

strrpos - PHP マニュアル

int strrpos ( string $haystack , string $needle [, int $offset ] )
$haystack の中で、単一文字 $needle が最後に現れた位置を返す
// テスト
foreach ($array as $path) {
    $pos  = strrpos($path), '.'); //「.(ドット)」が最後に現れる位置
    $name = substr($path), 0, $pos); //拡張子の前までを取得
    var_dump($name);echo "
"; }
// 実行結果 string(17) "/www/htdocs/index" string(20) "/ドキュメント/data-4" string(37) "c:/aaa/bbb/usr/あああ/aaa/新しい.かも"

前述の方法等でディレクトリ名とファイル名を分離した後に使う

その4 array_diff() 関数でファイル名取得

array_diff - PHP マニュアル

array array_diff ( array $array1 , array $array2 [, array $ ... ] )
$array1$array2 と比較し、その差を返す
// テスト
foreach ($array as $path) {
    $arrfname0 = explode('/',$path); // ディレクトリとファイル名の配列
    $arrfname1 = explode('/',dirname( $path )); // ディレクトリのみの配列
    echo array_diff( $arrfname0 ,$arrfname1); // ファイル名取得
}

その5strrchr 関数と basename 関数を使って拡張子なしファイル名取得

strrchr - PHP マニュアル

string strrchr ( string $haystack , mixed $needle )
$haystack の中で $needle が最後に現れた位置から終わりまでを返す
// テスト
foreach ($array as $path) {
    echo basename($file, strrchr($path, ".")); 
}
// 実行結果
index
data-4
Vしい.かも

PHP 5.2.2 文字化けは修正されているらしい。
それぞれ組み合わせて使いたい。
正規表現を使った方がすっきりしそうではあるので、いずれ考えよう。

参考

【PHP】pathinfo、basename関数の日本語ファイル名取得問題 - 作業日報

ラベル:


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google