fnmatch

関数の概要

fnmatch 関数は、指定したパターンに文字列がマッチするかどうかを判定するためのPHP関数です。ファイル名やパスのパターンマッチングでよく使われ、ワイルドカード(*、?)や文字クラスを使った柔軟な一致判定が可能です。特にファイル操作の際に便利で、特定の拡張子や名前のファイルのみ処理したい場合などに役立ちます。

パラメータの説明

  • pattern(string): マッチングに使うパターン文字列。ワイルドカードとして「*」は任意の文字列、「?」は任意の1文字を表します。
  • string(string): パターンと比較したい対象の文字列。
  • flags(int): オプションのフラグ。次の4つのいずれかまたは組み合わせを指定できます。
    • FNM_NOESCAPE:パターン中のバックスラッシュをエスケープ文字として扱わない
    • FNM_PATHNAME:パターン中の「*」や「?」はディレクトリ区切り文字「/」にマッチしない
    • FNM_PERIOD:ピリオド「.」は特別扱いされ、ファイル名の先頭の「.」にマッチしない
    • FNM_CASEFOLD:大文字・小文字を区別しないマッチングを実現

戻り値

パターンに一致すれば true、一致しなければ false を返します。エラー時には false が返るため、失敗と不一致の判別が必要な場合は注意が必要です。

使用例

基本的な使い方

<?php
if (fnmatch("*.txt", "document.txt")) {
    echo "txtファイルです。";
} else {
    echo "txtファイルではありません。";
}
?>

この例では、”document.txt” が “*.txt” のパターンにマッチするかどうかを判定し、マッチすればメッセージを表示します。

ディレクトリ区切りの扱い

<?php
$path = "dir/example.txt";
if (fnmatch("dir/*.txt", $path, FNM_PATHNAME)) {
    echo "dirディレクトリ内のtxtファイルです。";
} else {
    echo "一致しません。";
}
?>

FNM_PATHNAME フラグを使うと、ワイルドカードはスラッシュ「/」を跨いでマッチしません。この例では、「dir/」配下のtxtファイルのみが対象となります。

大文字・小文字を区別しないマッチング

<?php
if (fnmatch("*.TXT", "document.txt", FNM_CASEFOLD)) {
    echo "拡張子がTXTのファイルとマッチしました。";
} else {
    echo "マッチしませんでした。";
}
?>

FNM_CASEFOLD フラグを指定すると、大文字と小文字を区別せずにパターンマッチングが可能です。この例では “*.TXT” が “document.txt” とマッチします。

関連する関数

  • glob():指定したパターンにマッチするファイルやディレクトリの一覧を取得する
  • preg_match():正規表現を使ったより高度なパターンマッチング
  • pathinfo():パス情報を解析するための関数

まとめ

fnmatch はシンプルかつ強力なワイルドカードパターンマッチングを提供し、特にファイル操作においてファイル名のフィルタリングに役立ちます。オプションのフラグを適切に使うことで、用途に応じた柔軟な判定が可能です。PHPで簡単にファイルパターン判定を行いたい場合は、ぜひ fnmatch を活用しましょう。