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

作成日: 更新日:

preg_replace_callback関数は、正規表現パターンにマッチした文字列を、ユーザーが定義したコールバック関数の戻り値に置き換える処理を実行する関数です。この関数は、文字列内の特定の部分を検索し、それらを動的に生成される値に置き換えたい場合に非常に強力なツールとなります。

具体的には、対象の文字列内で正規表現パターンに合致する箇所が見つかるたびに、指定されたコールバック関数が呼び出されます。このコールバック関数には、マッチした部分文字列全体と、正規表現でキャプチャされたサブパターンが配列として引数に渡されます。コールバック関数は、これらの情報をもとに何らかの処理を行い、その結果として返された文字列が、元のマッチした部分文字列の代わりに挿入されます。

これにより、単純な固定値による置換では実現できない、複雑な条件に基づく文字列の変換や、マッチした内容に応じた柔軟な整形が可能になります。例えば、日付形式の変換、特定のHTMLタグの内容の加工、あるいはマッチした数値に対する計算結果の挿入など、多岐にわたる用途で利用できます。処理が成功すると置換後の文字列が返され、エラーが発生した場合はNULLが返されます。

基本的な使い方

構文(syntax)

<?php
$subject = 'The original string has numbers like 10 and 20.';
$pattern = '/\d+/';
$callback = function (array $matches): string {
    return (string)((int)$matches[0] * 2);
};
$replaced_string = preg_replace_callback($pattern, $callback, $subject);
?>

引数(parameters)

array|string $pattern, callable $callback, array|string $subject, int $limit = -1, int &$count = null

PHP:

  • array|string $pattern: 検索する正規表現パターン。配列で指定すると、複数のパターンを順番に適用します。
  • callable $callback: パターンにマッチした部分を処理するコールバック関数。
  • array|string $subject: 検索対象の文字列または文字列の配列。
  • int $limit = -1: 置換回数の上限。-1を指定すると無制限になります。
  • int &$count = null: 置換された回数が格納される変数。参照渡しで渡されます。

戻り値(return)

array|string|null

preg_replace_callback関数は、正規表現にマッチした部分をコールバック関数によって置換した結果を、配列または文字列として返します。置換対象がなかった場合はnullを返します。

サンプルコード

PHP preg_replace_callbackで全置換する

<?php

/**
 * preg_replace_callback の使用例:すべてのマッチに対してコールバック関数を実行し、置換する。
 *
 * @param string $subject 対象の文字列
 * @return string 置換後の文字列
 */
function replaceAllWithCallback(string $subject): string
{
    $pattern = '/[aeiou]/'; // 母音 (a, e, i, o, u) にマッチする正規表現パターン
    $callback = function (array $matches) {
        return strtoupper($matches[0]); // マッチした母音を大文字に変換
    };

    // preg_replace_callback を使用して、すべてのマッチに対してコールバック関数を実行
    $result = preg_replace_callback($pattern, $callback, $subject);

    return $result;
}

// 使用例
$originalString = "hello world";
$replacedString = replaceAllWithCallback($originalString);

echo "元の文字列: " . $originalString . PHP_EOL; // 出力: 元の文字列: hello world
echo "置換後の文字列: " . $replacedString . PHP_EOL; // 出力: 置換後の文字列: hEllO wOrld

?>

preg_replace_callback関数は、文字列の中から正規表現パターンにマッチする部分を検索し、マッチした部分をコールバック関数の実行結果で置換するPHPの関数です。第一引数$patternには正規表現パターンを指定します。第二引数$callbackには、マッチした文字列を処理するためのコールバック関数(無名関数や通常の関数)を指定します。このコールバック関数は、マッチした文字列全体を含む配列を引数として受け取り、置換後の文字列を返します。第三引数$subjectには、検索対象となる文字列を指定します。第四引数$limitは置換を行う最大回数を指定します。デフォルト値は-1で、これは制限なしを意味します。第五引数$countには、置換された回数が格納されます(参照渡し)。

上記のサンプルコードでは、replaceAllWithCallback関数がpreg_replace_callbackを使用して、文字列内のすべての母音(a, e, i, o, u)を大文字に変換しています。正規表現パターン/[aeiou]/は、これらの母音にマッチします。コールバック関数は、マッチした母音を大文字に変換するstrtoupper関数を使用しています。preg_replace_callbackは、$subject文字列内のすべての母音を検索し、見つかった各母音に対してコールバック関数を実行し、その結果で元の母音を置換します。最終的に、置換後の文字列がreplaceAllWithCallback関数から返されます。preg_replace_callback関数は、置換後の文字列、またはエラーが発生した場合はnullを返します。

preg_replace_callback関数は、正規表現にマッチした部分をコールバック関数で処理し置換する関数です。初心者の方は、引数の順番や型を間違えやすいので注意が必要です。$patternには正規表現を文字列で指定し、$callbackには呼び出す関数を指定します。$subjectは置換対象の文字列です。

コールバック関数は、マッチした文字列を含む配列を受け取ります。配列の最初の要素 $matches[0] がマッチ全体を表します。正規表現にグループがある場合は、$matches[1]$matches[2]...にそれぞれのグループが格納されます。

preg_replace_callbackは、置換後の文字列を返しますが、エラーが発生した場合はnullを返します。返り値がnullの場合に備え、エラーハンドリングを行うようにしましょう。また、正規表現のエスケープ処理が適切に行われているか確認してください。特に、ユーザーからの入力値を$patternに含める場合は、サニタイズを徹底してください。

preg_replace_callback_arrayで複数パターン置換する

<?php

/**
 * preg_replace_callback_array の使用例を示します。
 * 複数の正規表現パターンに対し、それぞれ異なるコールバック関数を適用して文字列を置換します。
 *
 * @param string $subject 置換処理の対象となる文字列。
 * @return string 置換処理が適用された後の文字列。
 */
function applyMultipleRegexReplacements(string $subject): string
{
    // `preg_replace_callback_array` は、複数の正規表現パターンと
    // それらに関連付けられたコールバック関数を一度に適用する際に便利です。
    // PHP 7.0 以降で利用可能です。
    $patternsAndCallbacks = [
        // パターン1: "php" または "html" を見つけたら大文字に変換する (大文字小文字を区別しない)
        '/php|html/i' => function (array $matches): string {
            return strtoupper($matches[0]);
        },

        // パターン2: 数字を見つけたら2倍にする
        '/\d+/' => function (array $matches): string {
            return (string)((int)$matches[0] * 2);
        },

        // パターン3: "example" という単語を見つけたら "SOLUTION" に置き換える
        '/\bexample\b/i' => function (array $matches): string {
            return 'SOLUTION';
        },
    ];

    // `preg_replace_callback_array` を呼び出し、定義されたパターンとコールバックを適用します。
    // - `$patternsAndCallbacks`: キーが正規表現パターン、値がコールバック関数の連想配列。
    // - `$subject`: 置換対象の文字列。
    // - `$limit`: 置換を適用する回数の上限。-1 は無制限を意味します。
    // - `&$count`: (オプション) 実際に置換が行われた回数が格納される変数。
    $modifiedSubject = preg_replace_callback_array(
        $patternsAndCallbacks,
        $subject,
        -1, // 全ての出現を置換
        $count // 置換回数がこの変数に格納される (この例では使用しない)
    );

    // エラーが発生した場合(例えば、正規表現が不正な場合)は null が返される可能性があります。
    // このサンプルでは単純化のため、null チェックは行いません。
    if (is_null($modifiedSubject)) {
        // 実際にはエラーハンドリングをここに記述
        return $subject; // 処理失敗時は元の文字列を返すなど
    }

    return $modifiedSubject;
}

// --- サンプルコードの実行例 ---
$originalText = "PHP is a scripting language. HTML is its markup partner. I need 5 examples of PHP code and 3 examples of HTML.";
echo "元の文字列: " . $originalText . PHP_EOL;

$processedText = applyMultipleRegexReplacements($originalText);
echo "処理後の文字列: " . $processedText . PHP_EOL;

// 別の例
$anotherText = "My version is 8.4.12 of PHP. This example shows an expert's skill.";
echo "元の文字列: " . $anotherText . PHP_EOL;
$processedAnotherText = applyMultipleRegexReplacements($anotherText);
echo "処理後の文字列: " . $processedAnotherText . PHP_EOL;

?>

preg_replace_callback_arrayは、PHPで複数の正規表現パターンを同時に使用し、それぞれ異なる処理(コールバック関数)を適用して文字列の置換を行うための関数です。

この関数は、主に四つの引数を取ります。最初の引数である$patternsAndCallbacksは、キーに正規表現パターン、値にそのパターンにマッチした際実行されるコールバック関数を指定する連想配列です。コールバック関数は、マッチした部分文字列の情報を配列として受け取り、置換後の文字列を返します。次に、$subject引数には置換処理の対象となる文字列を指定します。$limit引数は置換を行う回数の上限で、デフォルト値の-1は全てのマッチを置換することを意味します。最後の&$count引数には、参照渡しで実際に置換が行われた回数が整数で格納されます。

関数が成功した場合の戻り値は、置換処理が適用された後の文字列です。もし正規表現の記述に誤りがあるなど、処理中にエラーが発生した場合はnullが返されます。

サンプルコードでは、「php」や「html」というキーワードを大文字に変換する、数字を見つけたら2倍にする、「example」という単語を「SOLUTION」に置き換える、という複数の置換ルールを定義しています。これらのルールを$patternsAndCallbacks配列にまとめてpreg_replace_callback_array関数に渡すことで、一つの文字列に対して複数の異なる加工処理を一度に効率良く適用し、柔軟な文字列変換を実現しています。

preg_replace_callback_arrayは、複数の正規表現パターンとそれぞれに対応するコールバック関数を一度に適用できる便利な関数で、PHP 7.0以降で利用可能です。引数の$patternsAndCallbacksは、キーが正規表現、値がコールバック関数の連想配列として渡します。コールバック関数にはマッチした文字列が$matches配列で渡され、$matches[0]で全体を取得できます。正規表現の記述ミスなどにより処理が失敗した場合、戻り値はnullとなるため、必ずnullチェックを行い、エラーハンドリングを実装してください。$limitで置換回数の上限、&$countで実際の置換回数を取得できます。

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