Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】preg_replace_callback_array()関数の使い方

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

作成日: 更新日:

基本的な使い方

preg_replace_callback_array関数は、複数の正規表現パターンと、それら各パターンに対応するコールバック関数を一度に指定し、入力文字列内でマッチした部分を置換する関数です。

この関数は、単一の正規表現パターンとコールバック関数を用いて置換を行うpreg_replace_callback関数の拡張版と位置づけられます。従来の関数では、異なる正規表現に対して異なる処理を行う場合、関数を複数回呼び出す必要がありましたが、preg_replace_callback_array関数では、連想配列形式でパターンとコールバック関数のペアを複数渡すことで、一度の呼び出しでこれを実現できます。

第一引数には、キーに正規表現パターン、値にそのパターンがマッチした場合に実行されるコールバック関数を指定した連想配列を渡します。第二引数には、検索と置換の対象となる文字列(または文字列の配列)を指定します。これにより、複雑な文字列処理において、異なる条件に基づいた複数の置換ルールを簡潔かつ効率的に適用することが可能になります。

コールバック関数は、マッチした部分の情報を引数として受け取り、その情報に基づいて置換後の文字列を返します。この柔軟性により、単なる固定値への置換だけでなく、マッチした内容に応じた動的な文字列生成や加工を行うことができます。置換処理が成功した場合は置換後の文字列を返し、エラーが発生した場合はNULLを返します。この関数は、特に文字列の整形やデータのクレンジングなど、多様な正規表現と処理を組み合わせる必要がある場面で非常に役立ちます。

構文(syntax)

1<?php
2$subject = "Hello 123 World 456.";
3
4$pattern_callbacks = [
5    '/\d+/' => function (array $matches) {
6        return $matches[0] * 2;
7    },
8    '/World/' => function (array $matches) {
9        return 'PHP';
10    },
11];
12
13$result = preg_replace_callback_array($pattern_callbacks, $subject);

引数(parameters)

array $pattern, string|array $subject, int $limit = -1, int &$count = null, int $flags = 0

  • array $pattern: 置換処理を行う正規表現パターンとコールバック関数の連想配列
  • string|array $subject: 置換対象の文字列、または文字列の配列
  • int $limit = -1: 各パターンに対して実行する置換の最大回数。-1は無制限
  • int &$count = null: 実行された置換の総数を格納する変数
  • int $flags = 0: 正規表現のフラグを指定

戻り値(return)

array|string|null

正規表現のパターンとコールバック関数の配列に基づいて、文字列の置換処理を行います。処理結果として、置換後の文字列、または置換が行われなかった場合は元の文字列が返されます。置換処理中にエラーが発生した場合は、NULLが返されます。

サンプルコード

PHP preg_replace_callback_array で複数置換する

1<?php
2
3/**
4 * preg_replace_callback_array 関数の使用例
5 *
6 * この関数は、複数の正規表現パターンとそれぞれのコールバック関数を一度に適用し、
7 * 文字列の置換を行うことができます。システムエンジニアを目指す初心者向けに、
8 * 簡単な文字列操作の例を示します。
9 */
10function demonstratePregReplaceCallbackArray(): void
11{
12    // 置換対象となる元の文字列
13    $subject = "こんにちは、[PHP]の世界へようこそ!あなたのスコアは123pointです。";
14
15    // 複数の正規表現パターンと、それぞれに対応する匿名関数(コールバック)を定義します。
16    // キーが正規表現パターン、値がそのパターンにマッチした際実行されるコールバック関数です。
17    $patterns = [
18        // パターン1: 角括弧で囲まれたテキストを<strong>タグで囲みます。
19        // 例: [PHP] -> <strong>PHP</strong>
20        // $matches[0] はマッチ全体(例: "[PHP]")
21        // $matches[1] はキャプチャグループ1(例: "PHP")
22        '/\[(.*?)\]/' => function (array $matches): string {
23            // HTMLエンティティに変換してXSS攻撃を防ぎます。
24            return '<strong>' . htmlspecialchars($matches[1]) . '</strong>';
25        },
26
27        // パターン2: 数字の後に続く英字を大文字に変換します。
28        // 例: 123point -> 123POINT
29        // $matches[0] はマッチ全体(例: "123point")
30        // $matches[1] はキャプチャグループ1(例: "point")
31        '/\d+([a-zA-Z]+)/' => function (array $matches): string {
32            // マッチ全体 ($matches[0]) の中から、英字部分 ($matches[1]) を大文字に置換します。
33            return str_replace($matches[1], strtoupper($matches[1]), $matches[0]);
34        },
35
36        // パターン3: "こんにちは" という文字列を "Hello" に置換します。
37        '/こんにちは/' => function (): string {
38            // このパターンにはキャプチャグループがないため、$matches引数は省略可能です。
39            return 'Hello';
40        },
41    ];
42
43    echo "元の文字列: " . $subject . "\n";
44
45    // preg_replace_callback_array 関数を使用して置換を実行します。
46    // 第1引数: 定義したパターンとコールバックの配列
47    // 第2引数: 置換対象の文字列
48    // 第3引数: 置換回数の上限(-1は無制限)
49    // 第4引数: 置換が実行された合計回数を格納する変数(参照渡し)
50    $replacedSubject = preg_replace_callback_array($patterns, $subject, -1, $totalReplacementsCount);
51
52    // 戻り値が null の場合、エラーが発生したことを示します。
53    if ($replacedSubject === null) {
54        echo "エラーが発生しました。正規表現の記述またはコールバック関数に問題がないか確認してください。\n";
55    } else {
56        echo "置換後の文字列: " . $replacedSubject . "\n";
57        echo "合計置換回数: " . $totalReplacementsCount . "回\n";
58    }
59}
60
61// 定義した関数を呼び出し、実行します。
62demonstratePregReplaceCallbackArray();

preg_replace_callback_array関数は、複数の正規表現パターンとそれぞれに対応するコールバック関数を一度に適用し、文字列の置換を行うためのPHP 8の機能です。この関数は、複雑な条件に基づいて文字列を加工する際に非常に便利で、システムエンジニアを目指す方にとって文字列処理の強力なツールとなります。

サンプルコードでは、「こんにちは、[PHP]の世界へようこそ!あなたのスコアは123pointです。」という元の文字列に対し、複数の置換ルールを適用します。まず$patterns配列で、正規表現と、その正規表現にマッチした部分をどのように加工するかを定義する匿名関数(コールバック関数)のペアを複数設定しています。例えば、「[PHP]」のような角括弧で囲まれた部分を<strong>PHP</strong>タグで囲んだり、「123point」の"point"部分を大文字に変換したりする処理が、それぞれのコールバック関数内で定義されています。

preg_replace_callback_array関数は、第1引数にこの$patterns配列を、第2引数に置換対象の文字列$subjectを指定して実行します。第3引数で置換回数の上限(-1は無制限)を設定し、第4引数(&$totalReplacementsCount)には、置換が実行された合計回数が参照渡しで格納されます。関数は、置換が成功した場合は加工された文字列を返しますが、正規表現の記述に誤りがあるなどエラーが発生した場合はnullを返します。これにより、様々な条件に対応した文字列処理を効率的に実行できます。

正規表現の記述には細心の注意が必要です。特にキャプチャグループの使用方法やエスケープ処理を誤ると、意図しないマッチングやエラーを引き起こします。コールバック関数内で $matches 配列を扱う際は、$matches[0]がマッチ全体、$matches[1]以降がキャプチャグループであることを理解し、正しく参照してください。

置換後の文字列をHTMLとして出力する場合は、悪意のあるスクリプトの挿入を防ぐため、必ず htmlspecialchars() などでエスケープ処理を行い、XSS対策を講じてください。この関数の戻り値が null の場合は、正規表現やコールバック関数に問題があることを示しますので、必ずエラーチェックを行い原因を特定しましょう。複数の正規表現を適用する際、パターンの定義順序や内容によっては、最終的な置換結果に影響を与える可能性があります。意図した結果が得られるか、十分にテストしてください。

PHP preg_replace_callback_arrayで複数パターン置換

1<?php
2
3/**
4 * preg_replace_callback_array 関数の使用例
5 * 複数の正規表現パターンに対し、それぞれ異なるコールバック関数を適用して文字列を置換します。
6 * システムエンジニアを目指す初心者の方向けに、具体的な例でその働きを示します。
7 */
8function demonstratePregReplaceCallbackArray(): void
9{
10    // 検索・置換の対象となる元の文字列
11    $subject = "Hello World! This is a test string with numbers like 123 and words like apple and orange.";
12
13    echo "元の文字列: " . $subject . PHP_EOL . PHP_EOL;
14
15    // 正規表現パターンと、それに対応するコールバック関数を定義する連想配列。
16    // キーは正規表現パターン、値はマッチした部分文字列に対して実行される無名関数 (クロージャ) です。
17    $patterns = [
18        // パターン1: "World" という単語を検索し、"PHP World" に置換します。
19        // コールバック関数は、マッチした文字列の配列 (ここでは ["World"]) を受け取り、
20        // 加工した文字列 ("PHP World") を返します。
21        '/World/' => function (array $matches): string {
22            // $matches[0] は正規表現にマッチした文字列全体です。
23            return 'PHP ' . $matches[0];
24        },
25
26        // パターン2: 1つ以上の数字の並びを検索し、その数字を2倍にして括弧で囲みます。
27        '/\d+/' => function (array $matches): string {
28            return '(' . ((int)$matches[0] * 2) . ')';
29        },
30
31        // パターン3: "apple" という単語を検索し、"BANANA" (大文字のバナナ) に置換します。
32        // PHP 7.4 以降で利用可能なアロー関数 (fn) も使用できます。簡潔なコールバックに便利です。
33        '/apple/' => fn (array $matches): string => strtoupper('banana'),
34
35        // パターン4: "orange" という単語を検索し、"grape" に置換します。
36        '/orange/' => fn (array $matches): string => 'grape',
37    ];
38
39    // preg_replace_callback_array 関数を実行し、文字列の置換を行います。
40    // 第一引数に定義したパターン配列、第二引数に置換対象の文字列を渡します。
41    // 第三引数 ($limit) は各パターンで最大いくつのマッチを置換するか (-1 は全て置換)。
42    // 第四引数 (&$count) は、置換された総数を格納する変数への参照を渡すことができます。
43    $result = preg_replace_callback_array($patterns, $subject);
44
45    // 結果の出力
46    if ($result === null) {
47        echo "エラーが発生しました。正規表現の記述を確認してください。" . PHP_EOL;
48    } else {
49        echo "置換後の文字列: " . $result . PHP_EOL;
50    }
51}
52
53// 上記で定義した関数を実行し、処理を確認します。
54demonstratePregReplaceCallbackArray();

preg_replace_callback_array関数は、PHP 8で提供される強力な文字列置換関数です。この関数は、複数の正規表現パターンに対して、それぞれ異なる処理(コールバック関数)を適用して文字列を効率的に置換するために使用されます。

サンプルコードでは、まず$subjectという変数に置換対象となる元の文字列を定義しています。次に、$patternsという連想配列を作成し、ここに置換ルールをまとめています。この配列のキーには検索したい正規表現パターンを、値にはそのパターンにマッチした部分文字列に対して実行される無名関数(コールバック関数)を指定します。コールバック関数は、マッチした文字列の配列を引数として受け取り(例:$matches[0]がマッチした文字列全体です)、加工後の文字列を返します。例えば、/World/パターンではWorldPHP Worldに、/\d+/パターンでは数字を2倍にして括弧で囲む処理を行っています。アロー関数(fn)はPHP 7.4以降で利用でき、簡潔なコールバック記述に役立ちます。

preg_replace_callback_array関数は、第一引数にこの$patterns配列を、第二引数に置換対象の$subject文字列を受け取ります。オプションの第三引数$limitでは、各パターンで最大いくつのマッチを置換するかを指定でき、デフォルトの-1は全てを置換します。関数は、置換が成功すると加工後の文字列を返し、エラーが発生した場合はnullを返します。これにより、複数の置換処理を一度に柔軟かつ効率的に実行できるため、特に複雑な文字列操作が必要な場面で非常に有用です。

preg_replace_callback_array関数では、正規表現パターンの記述ミスが原因で、戻り値がnullとなる場合がありますので、エラー処理と合わせて正確なパターン記述を心がけてください。コールバック関数は、置換後の文字列を必ず返すようにし、引数として渡される$matches配列の$matches[0]に正規表現全体にマッチした部分文字列が格納されることを理解しておきましょう。複数の正規表現パターンは定義した配列の順序で処理されますので、適用順序を考慮した定義が重要です。また、$limit引数で各パターンの置換数を、&$count引数で置換された総数を取得できますので、必要に応じて活用してください。

関連コンテンツ

関連IT用語