fnmatch

ファイル名がパターンにマッチするか調べる

説明

bool fnmatch(string $pattern, string $filename, int $flags = 0)

fnmatchfilename で指定された文字列が pattern で指定されたシェルワイルドカードにマッチするかどうかチェックします。

パラメータ

pattern

マッチさせるパターン。 通常、pattern には '?''*' のようなワイルドカードを含めます。

pattern で使えるワイルドカード
ワイルドカード 説明
? クエスチョンマークは、1文字にマッチします。 たとえば、 "file?.txt""file1.txt""fileA.txt" にはマッチしますが、 "file10.txt" にはマッチしません。
* アスタリスクは、0文字以上の文字にマッチします。 たとえば、 "foo*.xml""foo.xml""foobar.xml" にマッチします。
[ ] 角括弧は、アスキー文字のコードポイントや、 文字の集合を表すのに使います。 たとえば、"index.php[45]""index.php4""index.php5" にマッチしますが、 "index.phpt" にはマッチしません。 よく知られている文字の範囲として [0-9], [a-z], [A-Z] が挙げられます。 複数の集合や範囲は、同時に使うことができます。 たとえば [0-9a-zABC] のように使えます。
! エクスクラメーションマークは、 角括弧内の文字を否定するのに使います。 たとえば、"[!A-Z]*.html""demo.html" にマッチしますが、 "Demo.html" にはマッチしません。
\ バックスラッシュは、特別な文字をエスケープするのに使います。 たとえば、"Name\?""Name?" にマッチしますが、 "Names" にはマッチしません。

filename

調べたい文字列。この機能は特にファイル名のマッチに便利ですが、 通常の文字列に関しても使用できます。

一般的なユーザーにとって、シェルパターンやあるいは少なくとも '?''*'によるワイルドカードのほうが 慣れていると思われます。そのため、 preg_match の代わりに fnmatch をフロントエンドの検索表現として使うことは、 プログラマではないユーザーにとってより便利でしょう。

flags

flags の値は、以下のフラグを 論理 OR (|) 演算子 で連結した任意の組み合わせです。

fnmatch で使えるフラグ
フラグ 説明
FNM_NOESCAPE バックスラッシュのエスケープを無効にする。
FNM_PATHNAME 文字列内のスラッシュは、指定したパターン内のスラッシュにのみマッチする。
FNM_PERIOD 文字列の先頭のピリオドは、指定したパターン内のピリオドにマッチしなければならない。
FNM_CASEFOLD 大文字小文字を区別しないマッチ。GNU 拡張の一部。

戻り値

マッチした場合に true、それ以外の場合に false を返します。

例1 シェルのワイルドカードパターンによる色の名前のチェック

<?php
if (fnmatch("*gr[ae]y", $color)) {
  echo "some form of gray ...";
}
?>

注意

警告

今のところ、この機能は POSIX に準拠していないシステムで利用できません (ただし、Windows では利用できます)。

参考

  • glob
  • preg_match
  • sscanf
  • printf
  • sprintf