Hatena::ブログ(Diary)

130単位

2008-11-18

PHP ファイル名の文字列から拡張子を取得する

あるソースコードを見ていたら、拡張子の取得部分が以下のように書かれていました。

方法1

<?php
$file_nm = $_FILES['upfile']['name'];

$tmp_ary = explode('.', $file_nm);
$extension = $tmp_ary[count($tmp_ary)-1];
?>

処理手順を説明すると以下のような感じでしょうか。

  1. ファイル名の文字列を「.」で分割して配列に格納
  2. countで配列の全要素数を計算
  3. 全要素数から-1したものをキーとする
  4. キーから配列の最後の要素の文字列(つまりは拡張子)を得る

正規表現を用いない、ある意味スマートな方法といえるのかもしれません。ただパッと見の印象としてはわかりづらいかと思います。

方法2

で、もうちょっと簡単に書けないものかと調べてみました。以下PHPマニュアルより引用。

mixed pathinfo  ( string $path  [, int $options  ] )

返り値

以下の要素を含む連想配列を返します。 dirname (ディレクトリ名)、basename (ファイル名) そして、もし存在すれば extension (拡張子)。

options を使用すると、 すべての要素を選択しない限りこの関数の返り値は文字列となります。

PHP: pathinfo - Manual

pathinfo()関数と、第二引数オプションを使用して以下のように書くことができます。

<?php
$file_nm = $_FILES['upfile']['name'];

$extension = pathinfo($file_nm, PATHINFO_EXTENSION);
?>

ついでに

余談ではありますが、「拡張子」の英字スペルは「extension」です。元ソースでは変数名が「$extention」と書かれていて、なんとなく悲しくなりました。ちょっとしたことでも、あるべき正しい姿を求めていきたいものです。


4774144371
パーフェクトPHP (PERFECT SERIES 3)

y_gurikoy_guriko 2011/01/19 12:16 検索でたどり着きました。

たしか、pathinfo()はファイル名の先頭が日本語だと
関数の仕様上、バグが発生したはずです。その点注意が必要です。

deeekideeeki 2011/01/19 15:01 コメントありがとうございます。
ご指摘のとおり PHP 5.2.2 以前だと先頭日本語のファイルはうまく動かないみたいですね。
ディレクトリ名と拡張子だけなら問題ないようです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/deeeki/20081118/pathinfoext
リンク元