PHPでファイルを検索するのに便利な関数があるのをご存じでしょうか。それが今回紹介するglob関数です。glob関数を使うことで、まるでLinuxのlsコマンドを使うような検索パターンでファイルを探せます。
とはいえ、PHPのプログラムの中からファイル名を検索する、という処理が理解できない、という方もいるでしょう。今回はそのような方にglob関数の機能とその使い方を詳しく解説します。
目次
PHPでファイル一覧を作る
PHPでファイル一覧を作る処理を作ろうとしたら、どうすれば良いのでしょうか。LinuxやmacOSのターミナルを利用したことのある方なら、lsコマンドでファイル一覧を表示できるのをご存じでしょう。
PHPでlsコマンドの実行結果を利用する方法を考える方がいるかもしれません。しかし、PHPにはファイル一覧を作る関数としてglobが用意されています。まずは、glob関数の機能をlsコマンドと比較して説明します。
ファイル一覧を表示するコマンド
あるフォルダ、または、ディレクトリの中にあるファイルの一覧を文字列にしてプログラム内で利用するケースがあるとします。その場合、多くの方はターミナルやコマンドプロンプトでファイル一覧を表示するコマンドの結果を利用する方法を思い浮かべるのではないでしょうか。
例えばLinuxやmacOSでは、ターミナルなどからlsコマンドを利用できます。
1 |
ls -1 > ../filelist.txt |
またWindowsのコマンドプロンプトからdirコマンドを実行しても同じような文字列を作れます。
1 |
dir /b > ..\filelist.txt |
PHPでファイル一覧を作るには
PHPのプログラムの中でファイルの一覧を作るとしたら、先ほどのlsコマンドを実行し、その結果を文字列として受け取る方法が使えます。例えばshell_execコマンドでls -1を実行し、その結果を配列に変換する方法です。
Linuxのlsコマンドの実行結果を利用する例
1 2 |
$list = shell_exec("/usr/bin/ls -1"); $filelist = explode("\n", $list); |
しかし、PHPにはファイル一覧を作成する関数としてglobが用意されています。外部のlsコマンドと同じ結果が得られるので、PHPのプログラムの中で使うのならglob関数を利用してください。
glob関数を利用した例
1 |
$filelist = glob("*"); |
glob関数の基本
PHPはファイルを扱う関数が幾つもありますが、その1つのglob関数は指定したフォルダの中に入っているファイル名の一覧を取得する関数です。しかも、glob関数に検索パターンを指定すれば、それに一致したファイル名のみのリストを取得できます。
次からglobの基本について解説します。
glob関数の文法
先ほど紹介したようにglob関数は、引数にパターンを指定し、それに一致するパス名の一覧を取得する関数です。また、glob関数で取得したリストのソートの有無を指定するオプションを指定するこもできます。
glob関数の文法
glob( パターン, [オプション] )
オプションは省略可能です。
なお、glob関数のパターンは、LinuxやmacOSなどで使われるシェルのファイル検索パターンと同じです。つまり、パターンの中にパスを指定しない場合はカレントディレクトリ、すなわちPHPを実行したディレクトリにあるファイルを対象とします。
また、パターンの中に「../」などの相対パスと「/var/www」といった絶対パスを指定できるので、検索対象のディレクトリをこのパターンの中に記述してください。
さらに、複数の文字にマッチする「*」と1文字にマッチ「?」、記号などの特殊な文字を使うためのエスケープなどもシェルと同じパターンも使用できます。
glob関数のオプションとは
glob関数はオプション無しでも利用できますが、細かい設定が必要な場合はオプションを活用できます。次にglob関数で利用できるオプションの一覧を紹介します。
glob関数のオプション一覧
(globより引用)
1 2 3 4 5 6 7 |
GLOB_MARK - 各ディレクトリにスラッシュ (Windows ではバックスラッシュ) を追加します GLOB_NOSORT - ディレクトリに存在するファイルを返します (ソートはされません)。このフラグを使わない場合は、パス名をアルファベット順にソートします。 GLOB_NOCHECK - 検索パターンにマッチするファイルが見つからない場合に、検索パターン自身を返します GLOB_NOESCAPE - バックスラッシュによるメタ文字のクォートを行いません GLOB_BRACE - {a, b, c} を展開し「a」、「b」あるいは「c」のいずれかにマッチさせます GLOB_ONLYDIR - パターンにマッチするディレクトリのみを返します GLOB_ERR - (ディレクトリが読めないなどの) 読み込みエラー時に停止します。デフォルトではエラーは無視されます。 |
glob関数を使った例
先ほど説明したように、glob関数はパターンに一致したファイル名のリストを配列で返す関数です。そのため、一旦配列の変数で受けて処理するか、配列を使う関数と組み合わせて利用します。
次に、glob関数を利用した例を紹介します。
glob関数の簡単な例
1 2 3 4 |
<?php $path = "/var/www/html/img" $lists = glob( ($path . "/*") ); ?> |
このプログラムは「../../images」の下にあるファイルの一覧を作る例です。
glob関数でオプションを指定しfreachに使った例
1 2 3 4 5 6 |
<?php $serch_path = "../../images/*" foreach( glob( ($serch_path), GLOB_NOSORT ) as $filename ) { echo basename($filename) . " size: " . filesize($filename) . "\n"; } ?> |
これは「GLOB_NOSORT」オプションを指定してglob関数でファイルのリストを作り、foerach文でパス名を含むファイル名からbasenameとfilesizeを作って表示する例です。
globはシンプルなパターンマッチが特徴
一般的に文字列の検索には正規表現が使われます。しかし正規表現は機能が豊富な分、初心者にとって難しい機能の1つです。その点、同じような検索機能を持つglobでは、UNIXシェルと同じパス名のパターンマッチが使われているので初心者でも使い易いのが特徴と言えます。
1 2 3 4 5 6 |
【globのパターンマッチ文字】 *(アスタリスク): 0文字以上の任意の文字列(ワイルドカード) ?(クエスチョンマーク):任意の1文字 ¥(円マーク):特殊文字のエスケープ(windows) \(バックスラッシュ):特殊文字のエスケープ(windows以外) [](角括弧):括弧内に現れる文字のどれか |
ファイル名のパターンマッチの例
1 2 3 |
*.jpg 拡張子が.jpgの全てのファイル名 log202012??.txt ファイル名がlog20201201.txtなど、2文字が任意の文字のファイル名 [a-d]?????.txt 最初の文字が小文字のアルファベットaからdのいずれかで始まる6文字からなるファイル名 |
もし、UNIXシェルと同じパス名をlsコマンドで体験したなら、macのターミナルがおすすめです。プログラミング学習にmacがいいかwindowsがいいかは意見が分かれますが、もし機会があれば試してみてください。
プログラミング学習にはmacが必須?最適なパソコンについて解説します!glob関数利用時の注意点
ファイル一覧を簡単に作れるglob関数ですが、利用する際に注意が必要なケースもあります。次からglob関数利用時の注意点について解説します。
URLは使用できない
PHPのfopen関数など、多くのファイルを扱う関数では、ファイルのパス名の代わりにWebサイトのURLを指定できます。しかし、glob関数ではURLを指定できないので注意してください。
これは、Webサーバー側でファイルの一覧表示を禁止しているからで、Webブラウザでもファイル一覧を表示できません。PHPからWebサーバーにアクセスし、その情報を利用するケースもあると思いますが、そのような用途でglob関数は使用できないので注意してください。
カレントディレクトリに注意
LinuxやmacOSのlsコマンド、およびWindowsのdirコマンドでパスを指定しない場合、そのコマンドを実行したカレントディレクトリにあるファイルの一覧を表示します。これはglob関数も同じです。
しかし、Webシステムを構成するPHPファイルの中でglob関数を使った場合、カレントディレクトリがどこか解りません。もしWebシステムでファイル一覧を作りたい場合は、ルートからのパス名を指定してください。
まとめ
これまで紹介したようにPHPのglob関数は、シンプルな検索パターンを用いて一致するファイル名を格納した配列を作る関数です。同じような処理はLinuxなどのlsコマンドをshell_exec関数などでも作れますが、glob関数を用いることでシンプルに書けます。
PHPのプログラムでファイル名を検索する仕組みを作るのに便利な関数なので、ぜひ利用してください。
【PHP】連想配列のキーや値を取得する方法を解説