PHP でファイル拡張子を取得する N つの方法
PHP でファイル拡張子を取得する N の方法
基本的に次の方法でインターネットから収集されます:
方法 1:
関数 get_extension($file)
{
substr(strrchr($file, '.'), 1);
}
方法 2:
関数 get_extension($file)
{
return substr($file, strrpos($file, '.')+1);
}
方法 3:
関数 get_extension($file)
{
return end(explode('.', $file));
}
方法 4:
関数 get_extension($file)
{
$info = pathinfo($file);
return $info['extension'];
}
方法 5:
関数 get_extension($file)
{
return pathinfo($file, PATHINFO_EXTENSION);
}
上記のメソッドをざっと見たところ、すべて機能しているようです。特にメソッド 1 と 2 は、pathinfo に 2 番目のパラメータがあることを知らなかったときから使用していました。しかし、よく考えてみると、最初の 4 つの方法にはさまざまな欠点があります。ファイル拡張子を完全に正しく取得するには、次の 3 つの特殊な状況に対処できなければなりません。
ファイル拡張子なし
パスには文字が含まれています (/home/test.d/test.txt
など)
パスには文字 . が含まれていますが、ファイルには拡張子がありません。 /home/test.d/test
など
明らかに、1 と 2 は 3 番目の状況を処理できず、3 は最初と 3 番目の状況を正しく処理できません。 4 は正しく処理されますが、拡張子が存在しない場合は警告が発行されます。方法 5 のみが最も正しい方法です。ちなみに、 pathinfo メソッドを見てください。公式サイトの紹介文は以下の通りです
$file_path = pathinfo('/www/htdocs/your_image.jpg');
echo "$file_path ['dirname']n";
echo "$file_path ['basename']n";
echo "$file_path ['拡張子']n";
echo "$file_path ['filename']n" // PHP 5.2+
のみ
最大 4 つの要素を含む配列が返されますが、常に 4 つあるとは限りません。たとえば、拡張機能がない場合は拡張要素も存在しないため、4 番目のメソッドは警告を検出します。ただし、phpinfo は 2 番目のパラメータもサポートしています。定数を渡して、返されるデータの特定の部分を指定できます:
PATHINFO_DIRNAME - ディレクトリ
PATHINFO_BASENAME - ファイル名 (拡張子付き)
PATHINFO_EXTENSION - 拡張子
PATHINFO_FILENAME - ファイル名 (拡張子なし、PHP>5.2)
これら 4 つの定数の値は 1、2、4、8 です。最初は OR 演算で複数の値を指定できると考えていました。
pathinfo($file, PATHINFO_EXTENSION | PATHINFO_FILENAME);
後で、これが機能しないことがわかりました。いくつかの OR 定数のうちの最小のものしか返されません。つまり、4 つのフラグ ビットの最小ビットは定数 1 です。