こんにちは!エンジニアのオータケです!
みなさんは、ファイルパスの中からファイル名だけ抽出したい、拡張子だけ抽出したいといったケースに遭遇したことはありませんか?
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サイト開発などでファイル名を管理するような場面で使うことがあるので忘れないようにしておきましょう!