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

作成日: 更新日:

preg_grep関数は、Perl互換正規表現(PCRE)を使用して、配列の要素の中から指定されたパターンにマッチする要素を抽出する関数です。

この関数は、第一引数に検索したい正規表現パターンを、第二引数に検索対象となる配列を指定します。正規表現とは、特定の文字列の形式(例えば、メールアドレスや電話番号の形式など)を定義するための強力なパターン記述方法です。preg_grep関数は、この正規表現パターンに基づいて対象配列の各要素を検査し、パターンに合致する要素のみを新しい配列として返します。この際、元の配列のキーは保持されます。

オプションの第三引数として「PREG_GREP_INVERT」フラグを指定することも可能です。このフラグを使用すると、指定された正規表現パターンに「合致しない」要素を抽出し、新しい配列として返すように動作が反転します。

この関数は、大量のデータの中から特定のルールに沿った情報だけを選び出したい場合や、データの整形・検証の前処理など、さまざまな場面で活用できます。例えば、ログデータから特定のエラーメッセージだけを抽出したり、ファイル名の一覧から特定の拡張子を持つファイルだけをフィルタリングしたりする際に非常に便利です。これにより、複雑な条件での配列のフィルタリング処理を効率的かつ簡潔に記述することが可能になります。

基本的な使い方

構文(syntax)

<?php

$inputArray = ["apple", "banana", "orange", "apricot", "grape"];
$pattern = "/^a/"; // "a"で始まる要素を検索
$flags = 0; // オプションなし

$matchingElements = preg_grep($pattern, $inputArray, $flags);

print_r($matchingElements);

?>

引数(parameters)

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

  • string $pattern: 検索する正規表現パターンを指定する文字列
  • array $array: 検索対象となる配列
  • int $flags = 0: 検索の振る舞いを制御するフラグ(デフォルトは0)

戻り値(return)

array|false

指定されたパターンにマッチした要素を配列で返します。マッチしなかった場合は空の配列を返しますが、エラーが発生した場合はfalseを返します。

サンプルコード

PHP preg_grepで配列からパターンにマッチする要素を抽出する

<?php

/**
 * preg_grepを使用して配列から特定のパターンの要素を抽出するサンプルです。
 *
 * この関数は、ファイル名の配列から正規表現を使い、
 * ログファイル(.logで終わるファイル)のみを抽出する例と、
 * ログファイル以外のファイルを抽出する例(PREG_GREP_INVERTフラグ使用)を示します。
 */
function demonstratePregGrep(): void
{
    // サンプルデータとして、様々なファイル名を含む配列を用意します。
    $fileList = [
        0 => 'access.log',
        1 => 'error.log',
        2 => 'index.php',
        3 => 'style.css',
        4 => 'debug.log.2023-10-26',
        5 => 'README.md',
    ];

    // '.log' で終わる文字列にマッチする正規表現パターンを定義します。
    // '$' は文字列の末尾を意味します。
    $pattern = '/\.log$/';

    // preg_grep() を使用して、配列からパターンにマッチする要素だけを抽出します。
    // マッチした要素のキーは元の配列から維持されます。
    $logFiles = preg_grep($pattern, $fileList);

    echo "■ '.log' で終わるファイル:\n";
    print_r($logFiles);
    echo "\n";

    // 第3引数に PREG_GREP_INVERT フラグを指定すると、
    // パターンに「マッチしなかった」要素を抽出できます。
    $nonLogFiles = preg_grep($pattern, $fileList, PREG_GREP_INVERT);

    echo "■ '.log' で終わらないファイル (PREG_GREP_INVERT を使用):\n";
    print_r($nonLogFiles);
}

// 関数を実行して結果を表示します。
demonstratePregGrep();

?>

PHPのpreg_grep関数は、配列の各要素に対して正規表現による検索を行い、パターンに一致した要素だけを抽出して新しい配列として返す関数です。

第1引数には、検索条件となる正規表現パターンを文字列で指定します。このサンプルでは「.logで終わる文字列」というパターンが使われています。第2引数には、検索対象となる配列を渡します。

関数の戻り値は、パターンに一致した要素を含む新しい配列です。このとき、元の配列のキー(添字)がそのまま維持される点が特徴です。処理中にエラーが発生した場合は、配列の代わりにfalseが返されます。

このサンプルコードでは、まずファイル名が格納された配列から、正規表現を使って.logで終わる要素(ログファイル)だけを抽出しています。次に、オプションである第3引数にPREG_GREP_INVERTフラグを指定しています。このフラグを使用すると結果が反転し、パターンに「一致しなかった」要素、つまりログファイル以外のファイルが抽出されます。このように、preg_grep関数は配列から特定の条件に合うデータを効率的に絞り込む際に役立ちます。

preg_grep関数は正規表現で配列の要素を絞り込む際に便利です。正規表現パターンは、サンプルコードのように'/'などの記号で必ず囲んでください。パターン中の.は「任意の1文字」を意味する特殊文字です。ファイル拡張子など、文字通りのドットにマッチさせたい場合は、意図しない動作を防ぐために\.のようにバックスラッシュでエスケープすることが重要です。この関数は、抽出後も元の配列のキーを維持するという特徴があります。また、第3引数にPREG_GREP_INVERTを指定すると、パターンに一致しなかった要素を逆に抽出できます。エラーが発生した場合は配列ではなくfalseを返す可能性があるため、戻り値のチェックを考慮すると、より安全なコードになります。

PHP preg_grepで多次元配列をフィルタリングする

<?php

/**
 * 多次元配列から特定のキーの値を正規表現で検索し、
 * マッチした要素を含む配列全体を抽出します。
 *
 * preg_grepは一次元の配列しか扱えないため、多次元配列を直接検索できません。
 * このサンプルでは、以下の手順で多次元配列をフィルタリングします。
 * 1. array_column() を使い、検索対象のキーの値だけを一次元配列として取り出す。
 * 2. preg_grep() を使い、その一次元配列を正規表現でフィルタリングする。
 *    このとき、preg_grep() は元の配列のキーを保持します。
 * 3. array_intersect_key() を使い、preg_grep() の結果(キー)と
 *    元の多次元配列のキーを比較し、一致する要素だけを抽出します。
 *
 * @param string $pattern 検索する正規表現パターン
 * @param array $multidimensionalArray 検索対象の多次元配列
 * @param string $key 検索する値が含まれるキー
 * @return array フィルタリングされた多次元配列
 */
function filterArrayByPregGrep(string $pattern, array $multidimensionalArray, string $key): array
{
    // 1. 指定されたキーの値だけを一次元配列として抽出します。
    // 例: ['userA@example.com', 'userB@example.net', 'userC@example.com']
    // 第3引数に検索対象のキーを指定することで、元の配列のキーと紐付きます。
    $values = array_column($multidimensionalArray, $key, key($multidimensionalArray));

    // 2. 抽出した一次元配列を preg_grep でフィルタリングします。
    // 元の配列のキーは保持されます。
    // 例: [0 => 'userA@example.com', 2 => 'userC@example.com']
    $matchedValues = preg_grep($pattern, $values);

    // preg_grep が失敗した場合やマッチしなかった場合は空の配列を返します。
    if ($matchedValues === false || empty($matchedValues)) {
        return [];
    }

    // 3. マッチしたキーを使って、元の多次元配列から該当する要素を抽出します。
    return array_intersect_key($multidimensionalArray, $matchedValues);
}

// サンプルデータ: ユーザー情報の多次元配列
$users = [
    [
        'id' => 1,
        'name' => 'Alice',
        'email' => 'alice.wonderland@example.com',
    ],
    [
        'id' => 2,
        'name' => 'Bob',
        'email' => 'bob.builder@example.net',
    ],
    [
        'id' => 3,
        'name' => 'Charlie',
        'email' => 'charlie.chaplin@example.com',
    ],
    [
        'id' => 4,
        'name' => 'Diana',
        'email' => 'diana.prince@another-domain.org',
    ],
];

// 検索パターン: '@example.com' で終わるメールアドレス
$pattern = '/@example\.com$/';

// 'email' キーを対象にフィルタリングを実行
$filteredUsers = filterArrayByPregGrep($pattern, $users, 'email');

// 結果を出力
print_r($filteredUsers);

PHPのpreg_grep関数は、配列の各要素を正規表現パターンで検索し、パターンに一致した要素だけを抽出して新しい配列として返す関数です。第一引数 $pattern に検索したい正規表現を、第二引数 $array に検索対象の配列を指定します。戻り値は、パターンに一致した要素を含む配列です。このとき、元の配列のキーは保持されるという特徴があります。

このサンプルコードは、preg_grepが本来一次元の配列しか扱えないという制約を回避し、多次元配列を対象に検索を行う方法を示しています。filterArrayByPregGrepという独自の関数を定義し、正規表現パターン、検索対象の多次元配列、そして検索したい値が含まれるキー名を引数として受け取ります。

関数内部では、まずarray_column関数を使って多次元配列から検索対象のキーの値だけを抜き出し、一時的な一次元配列を作成します。次に、その一次元配列に対してpreg_grepを実行し、パターンに一致した要素のキーを特定します。最後にarray_intersect_key関数を使い、特定したキーをもとにして、元の多次元配列から該当する要素全体を抽出します。この手順により、多次元配列の中から特定の条件に合うデータだけを効率的に絞り込むことが可能になります。

このサンプルコードは、preg_grepが一次元の配列しか扱えないという制約を、他の配列関数と組み合わせて解決しています。注意点として、正規表現パターン内の.のような特殊文字は、意図しないマッチを避けるため\.のようにエスケープが必要です。また、preg_grepはパターンが不正な場合などにfalseを返すため、必ず戻り値をチェックし、エラー処理を記述することが重要です。このコードは、array_columnで検索対象の値をキーと共に抽出し、preg_grepでフィルタリングした後、array_intersect_keyで元の多次元配列から該当データを再構築する流れになっています。この一連の処理を理解することが、正しく応用するための鍵となります。

PHP preg_grepで連想配列をフィルタリングする

<?php

/**
 * 連想配列から指定された正規表現パターンにマッチする要素を抽出するサンプル関数。
 *
 * preg_grep 関数は、配列の「値」に対して正規表現マッチングを行います。
 * 連想配列の場合でも、キーではなく値が評価対象となります。
 * マッチした値は新しい配列として返され、元の連想キーは破棄され、数値添字が割り当てられます。
 */
function filterAssociativeArrayByRegex(): void
{
    // 検索対象となる連想配列を定義します。
    $associativeArray = [
        'id_001' => 'Apple Inc. is a tech company.',
        'id_002' => 'Google LLC is also a tech company.',
        'id_003' => 'Microsoft Corporation makes software.',
        'id_004' => 'Amazon.com is an e-commerce giant.',
        'id_005' => 'Facebook (Meta Platforms) focuses on social media.',
        'id_006' => 'Tesla, Inc. specializes in electric vehicles.',
    ];

    echo "元の連想配列:\n";
    print_r($associativeArray);

    // 正規表現パターンを定義します。
    // ここでは「Inc.」または「LLC」を含む文字列を検索します。
    $pattern = '/(Inc\.|LLC)/';

    echo "\n正規表現パターン: " . $pattern . "\n";

    // preg_grep 関数を使用して、パターンにマッチする値を抽出します。
    // 第1引数: 正規表現パターン
    // 第2引数: 検索対象の配列
    // 第3引数: フラグ (0はデフォルトで、特別な動作を指定しない)
    $filteredArray = preg_grep($pattern, $associativeArray);

    echo "\npreg_grep でフィルタリングされた結果 (Inc. または LLC を含む):\n";

    // フィルタリングされた結果を表示します。
    // 結果は数値添字配列として返されます。
    if (!empty($filteredArray)) {
        print_r($filteredArray);
    } else {
        echo "マッチする要素は見つかりませんでした。\n";
    }

    // 別のパターンで試します。
    // 例: 「tech company」を含む文字列を検索
    $anotherPattern = '/tech company/';
    echo "\n別の正規表現パターン: " . $anotherPattern . "\n";

    $anotherFilteredArray = preg_grep($anotherPattern, $associativeArray);

    echo "\npreg_grep でフィルタリングされた結果 (tech company を含む):\n";
    if (!empty($anotherFilteredArray)) {
        print_r($anotherFilteredArray);
    } else {
        echo "マッチする要素は見つかりませんでした。\n";
    }
}

// 関数を実行します。
filterAssociativeArrayByRegex();

?>

PHPのpreg_grep関数は、配列の要素を正規表現パターンに基づいてフィルタリングするために利用されます。この関数は、第一引数に正規表現パターン($pattern)、第二引数に検索対象となる配列($array)を受け取ります。第三引数の$flagsはオプションで、特別な動作を指定しない場合はデフォルト値の0を使用します。

preg_grep関数は、配列の「値」に対して正規表現マッチングを行います。検索対象が連想配列であっても、キーではなく値が評価の対象となります。マッチした要素は新しい配列として返されますが、元の連想キーは破棄され、結果は数値添字(ゼロから始まるインデックス)の配列となります。

サンプルコードでは、最初に企業情報を含む連想配列を用意しています。最初の例では「Inc.」または「LLC」という正規表現パターンを使用し、これらの文字列を含む要素を抽出しています。次に「tech company」という別のパターンで同様の抽出を行っています。preg_grepは指定されたパターンに合致する要素のみを選び出し、新しい数値添字配列として結果を返します。もしパターンにマッチする要素が見つからなかった場合は、空の配列が返されます。これにより、配列から特定の条件を満たすデータだけを効率的に抽出することができます。

preg_grep関数は、配列の「値」に対してのみ正規表現による検索を行います。連想配列の場合でも、キーは検索対象外となり、値が評価されますので注意が必要です。マッチした要素は、元の連想キーが破棄され、数値添字が割り当てられた新しい配列として返されます。正規表現パターンはデリミタで囲み、特別な意味を持つ文字は適宜エスケープする必要があります。マッチする要素が一つもない場合は空の配列が返されますので、結果の確認にはempty()関数などを利用すると安全です。非常に大きな配列を処理する場合、パフォーマンスへの影響も考慮することが大切です。

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