【PHP入門】pathinfo関数を使って拡張子名やファイル名を簡単取得

こんにちは!エンジニアのオータケです!

みなさんは、ファイルパスの中からファイル名だけ抽出したい拡張子だけ抽出したいといったケースに遭遇したことはありませんか?

splitでファイルパスをセパレータで切り分けたり、substr関数を使って抽出したり様々な方法があるかと思います。

しかし、pathinfo関数を使えば一発でその悩みが解決します!

この記事では、

・pathinfo関数で何ができるのか?
・pathinfo関数のオプションを指定して深く使う方法

といった内容から

・pathinfoを扱う上での注意点

といった実践的な内容まで詳しく解説しています。

本記事を読んでpathinfo関数への理解を深めましょう!

目次

pathinfo関数とは?

どういうときに使うの?

pathinfo関数はファイルパスに関しての情報を配列で取得する関数です。

どういった情報が得られるのかと言うとindex.phpというファイルのファイル名indexだけを取得できたり、拡張子であるphpだけを取得できる関数です。

それだけでなく、/webhome/website/index.phpのようなファイルパスがあった場合、/webhome/websiteといったファイルが存在しているパスだけを抽出することもできます。

そんな便利なpathinfoを次の項で実際に使用してみましょう!

pathinfo関数を使ってみる

pathinfo関数の使い方は難しくありません。

早速サンプルを見てみましょう。

<?php
$info = pathinfo('/fruits/melon/eat/index.php');
var_dump($info);
?>

実行結果

array(4) {
  ["dirname"]=>
  string(17) "/fruits/melon/eat"
  ["basename"]=>
  string(9) "index.php"
  ["extension"]=>
  string(3) "php"
  ["filename"]=>
  string(5) "index"
}

まずpathinfo関数にはファイル名を含むファイルパスを渡しています。
使い方としては引数に渡すだけなので難しくはありません。

そしてパスに関する情報を戻り値として$infoに保持するように書いています。
この時、戻り値は配列になっており特定のキー名をしていすることでそれぞれの情報を持ってくることが可能です。

実行結果を見ていただくとわかりやすいかと思いますが、

dirname
basename
extension
filename

といった4種類の情報が取得できたかと思います。

上から解説していくとこのような形になります。

キー名内容
dirnameファイル名を除くディレクトリパス
basenameディレクトリパスを除くファイル名
extension引数で指定したファイル名の拡張子だけを抽出
filename引数で指定したファイル名の拡張子を除いたファイル名を取得

pathinfoを呼ぶだけでこのように簡単に情報を得られることができました!

こんなファイルパスの場合はどうなる?

特殊なファイルパス名の場合どういった結果が戻ってくるかを試してみました。
みなさんが実現したいことがこのpathinfoで実現できるか参考になれば幸いです!

その1 ディレクトリパスにドットが含まれている場合

例:/fruits/mask.melon/tabetai.php

実行結果:

array(4) {
  ["dirname"]=>
  string(18) "/fruits/mask.melon"
  ["basename"]=>
  string(11) "tabetai.php"
  ["extension"]=>
  string(3) "php"
  ["filename"]=>
  string(7) "tabetai"
}

その2 ファイル名に拡張子がない場合

例:/fruits/melon/tabetai

実行結果:

array(3) {
  ["dirname"]=>
  string(13) "/fruits/melon"
  ["basename"]=>
  string(7) "tabetai"
  ["filename"]=>
  string(7) "tabetai"
}

その3 ファイル名にドットが2つ以上含まれている場合

例:/fruits/melon/tabetai.oisii.php

array(4) {
  ["dirname"]=>
  string(13) "/fruits/melon"
  ["basename"]=>
  string(17) "tabetai.oisii.php"
  ["extension"]=>
  string(3) "php"
  ["filename"]=>
  string(13) "tabetai.oisii"
}

その4 ファイル名が存在しない(隠しファイル)である場合

例:/fruits/melon/.htaccess

array(4) {
  ["dirname"]=>
  string(13) "/fruits/melon"
  ["basename"]=>
  string(9) ".htaccess"
  ["extension"]=>
  string(8) "htaccess"
  ["filename"]=>
  string(0) ""
}

このような結果になりました。
ややこしいかな?と思うのはその4のhtaccessのような場合は少しややこしいかもしれません。

では続いてpathinfoを使う上で、ファイル名に日本語などのマルチバイト文字が含まれている場合はどうすればよいかを解説したいと思います!

pathinfo関数を使う上での注意点

pathinfoを使ってファイルパスの情報を取得したのはいいけど、結果が文字化けしていて使い物にならないといったことはありませんか?

そういった場合はsetlocale関数を使ってからpathinfoを扱うことで改善されます。

例えばこのようにすると良いでしょう。

<?php
setlocale(LC_ALL, 'ja_JP.UTF-8');
$info = pathinfo('/fruits/melon/おいしい.php');
var_dump($info);
?>

setlocale関数は設定が正しくできなかった場合falseを返すためそのあたりのチェック処理は必要ですが、このようにすれば文字化けを改善できる可能性があります。

まとめ

いかがでしょうか?

今回はファイル名や拡張子名といったファイルパス情報を取得するためのpathinfoについて解説してきました。

Webサイト開発などでファイル名を管理するような場面で使うことがあるので忘れないようにしておきましょう!

この記事を書いた人

30歳、フリーランスプログラマ。中学の頃よりプログラミングに興味を持ちゲーム開発やWebサイト構築などを経験
新しいフレームワークやライブラリに興味があり革新的な機能が含まれていると泣いて喜ぶ。

目次