【PHP8.x】fnmatch関数の使い方

fnmatch関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

fnmatch関数は、シェルで一般的に使用されるワイルドカードパターンを用いて、指定した文字列がパターンに一致するかどうかを検査する関数です。この関数は、主に2つの引数を取ります。第1引数には *(任意の0文字以上の文字列)や ?(任意の1文字)といったワイルドカードを含むパターン文字列を、第2引数には検査したい文字列(例えばファイル名)を指定します。検査の結果、文字列がパターンに一致すれば true を、一致しなければ false を返します。さらに、オプションの第3引数にフラグ定数を指定することで、マッチングの挙動を調整できます。例えば、FNM_CASEFOLD フラグを使用すると大文字と小文字を区別しない比較が行われ、FNM_PATHNAME フラグを使用するとパス区切り文字のスラッシュはパターン内のスラッシュにのみ一致するようになります。この関数は、ディレクトリ内のファイル一覧から特定の拡張子を持つファイルだけを抽出するなど、ファイル名のフィルタリング処理を簡単に行いたい場合に特に有効で、正規表現よりもシンプルに扱える点が特徴です。

構文(syntax)

1<?php
2
3$isMatch = fnmatch("*.log", "access.log");
4
5?>

引数(parameters)

string $pattern, string $string, int $flags = 0

  • string $pattern: マッチングに使用するワイルドカードパターンを指定する文字列
  • string $string: パターンと比較する対象の文字列
  • int $flags = 0: マッチングの挙動を制御するフラグ。デフォルトは0(フラグなし)

戻り値(return)

bool

指定されたパターンに文字列が一致した場合は true、一致しなかった場合は false を返します。

サンプルコード

php fnmatchでパターンマッチングする

1<?php
2
3/**
4 * fnmatch 関数のサンプルコード
5 *
6 * 指定されたパターンに文字列がマッチするかどうかを確認します。
7 */
8
9// マッチするかどうか確認する文字列
10$string = 'myfile.txt';
11
12// パターン(ワイルドカードを使用)
13$pattern = '*.txt';
14
15// フラグ(デフォルトは 0)
16$flags = 0;
17
18// fnmatch 関数を使用して文字列がパターンにマッチするかどうかを確認
19if (fnmatch($pattern, $string, $flags)) {
20    echo "文字列 '$string' はパターン '$pattern' にマッチします。\n";
21} else {
22    echo "文字列 '$string' はパターン '$pattern' にマッチしません。\n";
23}
24
25// 大文字・小文字を区別しないマッチング
26$string = 'MyFile.TXT';
27$pattern = '*.txt';
28$flags = FNM_CASEFOLD; // 大文字・小文字を区別しない
29
30if (fnmatch($pattern, $string, $flags)) {
31    echo "文字列 '$string' はパターン '$pattern' (大文字・小文字を区別しない) にマッチします。\n";
32} else {
33    echo "文字列 '$string' はパターン '$pattern' (大文字・小文字を区別しない) にマッチしません。\n";
34}
35
36// 複数のパターンを試す
37$patterns = ['myfile.txt', '*.txt', 'my*.txt'];
38
39foreach ($patterns as $pattern) {
40    if (fnmatch($pattern, $string, 0)) {
41        echo "文字列 '$string' はパターン '$pattern' にマッチします。\n";
42    } else {
43        echo "文字列 '$string' はパターン '$pattern' にマッチしません。\n";
44    }
45}

PHPのfnmatch関数は、ファイル名や文字列が指定されたパターンにマッチするかどうかを判定するために使用します。fnmatch(string $pattern, string $string, int $flags = 0): boolという形式で、第一引数にパターン、第二引数に比較対象の文字列を指定します。第三引数 $flags はオプションで、マッチングの挙動を制御するためのフラグを指定します。

このサンプルコードでは、まずmyfile.txtという文字列が*.txtというパターンにマッチするかどうかを確認しています。*はワイルドカードで、任意の文字列にマッチします。

次に、大文字・小文字を区別しないマッチングを行う例を示しています。FNM_CASEFOLDフラグを使用することで、MyFile.TXTのような文字列でも*.txtというパターンにマッチさせることができます。

最後に、複数のパターンに対してfnmatch関数を適用する例を示しています。foreachループを使用し、それぞれのパターンでmyfile.txtという文字列がマッチするかどうかを確認しています。

fnmatch関数は、文字列がパターンにマッチすればtrue、そうでなければfalseを返します。システム開発においては、ファイル名のフィルタリングや入力値の検証など、様々な場面で活用できます。

fnmatch関数は、ファイル名などの文字列が指定したパターンに合致するかどうかを判定します。パターンにはワイルドカード(*?など)を使用できます。大文字・小文字を区別しないマッチングを行う場合は、FNM_CASEFOLDフラグを使用します。$flags引数に他のフラグを組み合わせることも可能です。fnmatch関数はファイルシステム上のファイルやディレクトリの存在を確認するものではないため、ファイル名に類似した文字列のマッチングに利用します。パス区切り文字(/)のエスケープ処理は、FNM_PATHNAMEフラグを使用することで制御できます。戻り値はtrue(マッチした場合)またはfalse(マッチしない場合)です。

関連コンテンツ

【PHP8.x】fnmatch関数の使い方 | いっしー@Webエンジニア