【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サイト開発などでファイル名を管理するような場面で使うことがあるので忘れないようにしておきましょう!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

オータケ

オータケ

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

おすすめコンテンツ

いまならレッスン期間が2週間延長!この秋、プログラミングを学ぼう

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー