脱初心者備忘録

PHPでファイルの拡張子を取得する方法

拡張子を取得する利点

黄色の枠で囲まれた部分が拡張子です。
ファイルと拡張子の間には「.」があるので、そこを基準に、ファイル名から、拡張子だけを取得することが可能です。

プログラムにおいて、拡張子別に処理が変わったりすることが結構多いので、拡張子を取得することはとても重要な作業となります。

以下で、取得する方法をいくつか紹介します。実行するケースに応じて使い分けできると良いです。

strrpos() で探して、substr() で切り出す

substr は startで指定された位置から文字数バイト分の文字列を返し、見つからないときはfalseを返す関数です。通常、拡張子は、手前に「.」があるので、ドットの位置を求めると拡張子だけを切り出せます。
探し始める位置はデフォルトで0番目、終了する位置はデフォルトで最後の文字の場所です。

substr(対象の文字列, 探し始める位置, 終了する位置);


「.」の位置を求めるには、strrpos を使います。
strrpos は、探す文字列「.」が最後に現れる位置を、0から開始した数字で返し、見つからないときはfalseを返す関数です。探し始める位置はデフォルトで0番目です。

strrpos(string $haystack, string $needle, int $offset = 0);

$haystack:元の文字列
$needle:探したい文字列
$offset:探し始める位置(省略可能)

PHPマニュアル

substr も strrpos も見つからないときは false を返すので、見つかったときの0番目の0と明確に分けるため、比較には === を使う必要があります。

$filename = "test1.txt";

$ext = substr($filename, strrpos($filename, '.') + 1);

if($ext !== false) {
    echo $ext;
}

実行結果:txt

explode() で文字列を分割して、 end()で指定する

explode は文字列を、区切る文字で分け、配列で返す関数です。end()を使用することで、生成された配列の最終要素にセットします。limitは数字を指定でき、limitの要素を持つ配列が生成されます。

explode(string $separator, string $string, int $limit = PHP_INT_MAX);

$separator:区切り文字
$string:元の文字列
$limit:いくつの要素に分解するか(省略可能)

PHPマニュアル
$filename = "test1.txt";

$str = explode('.', $filename);
$ext = end($str);

echo $ext;

実行結果:txt

pathinfo() で取得して拡張子を返す

pathinfo() はファイルパスに関する情報を返す関数です。 PATHINFO_EXTENSION を指定することで、ファイルの最後の拡張子だけを返します。フラグの部分に、PATHINFO_DIRNAME / PATHINFO_BASENAME / PATHINFO_FILENAME / PATHINFO_EXTENSION を指定することで、指定した要素を返します。フラグを指定しない場合は、連想配列でファイル情報を返します。

pathinfo(string $path, int $flags = PATHINFO_ALL);

$path:ファイルパス(ファイルの場所+ファイル名)
$flags:取得したい要素の指定

PHPマニュアル
$filename = "test1.txt";

$ext = pathinfo($filename, PATHINFO_EXTENSION);

echo $ext;

実行結果:txt

どの方法が一番か

実行速度を計測したら以下の通り。

  • substr+strrpos
    5600 ナノ秒
  • explode+end
    2700 ナノ秒
  • pathinfo
    4700 ナノ秒

10回くらい計測したけど、explode+end が一番早かったので、とりあえず拡張子を取得したいってときはこれが一番かなと思います。