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

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

作成日: 更新日:

基本的な使い方

preg_replace関数は、正規表現による文字列の置換を実行する関数です。この関数は、指定された正規表現パターンに一致する文字列の箇所を、別の文字列に置き換えるために使用されます。

具体的には、検索したい正規表現パターンと、そのパターンが見つかった場合に置き換えたい文字列、そして実際に処理を行う対象の文字列を引数として受け取ります。例えば、ウェブサイトの入力フォームから受け取ったデータの中から特定の文字パターンを削除したり、テキストファイル内の特定の記述を一括で修正したりする際に非常に役立ちます。

この関数は、複数の検索パターンと複数の置換文字列を配列として指定することも可能です。これにより、一度の処理で複数の置換操作を効率的に実行できます。また、置換を行う最大回数を指定したり、実際に置換が行われた回数を取得したりするためのオプションも提供されています。

処理が成功した場合は、置換後の新しい文字列が返されます。正規表現の記述に誤りがある場合や、関数内部でエラーが発生した場合には、NULLが返されることがあります。強力な文字列操作機能であるため、正規表現の正確な記述と、対象文字列のエンコーディングには注意が必要です。システムエンジニアにとって、テキストデータの整形や加工、セキュリティ対策などに不可欠な関数の一つです。

構文(syntax)

1<?php
2$string = "こんにちは、世界!";
3$pattern = "/世界/";
4$replacement = "PHP";
5$new_string = preg_replace($pattern, $replacement, $string);
6echo $new_string;
7?>

引数(parameters)

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

  • array|string $pattern: 置換対象の正規表現パターン。配列または文字列で指定します。
  • array|string $replacement: 置換後の文字列。配列または文字列で指定します。
  • array|string $subject: 置換対象の文字列。配列または文字列で指定します。
  • int $limit = -1: 各 $subject に対して実行する置換の最大回数。デフォルトは -1 で、すべての出現箇所を置換します。
  • int &$count = null: 実行された置換の回数。NULL の場合はセットされません。

戻り値(return)

array|string|null

preg_replace 関数は、正規表現による検索と置換を行った結果を返します。置換が行われなかった場合は元の文字列が返され、エラーが発生した場合は null が返されます。

サンプルコード

preg_replace_callbackで数字を2倍にする

1<?php
2
3/**
4 * preg_replace_callback の基本的な使用方法を示す関数。
5 * この関数は、入力文字列内のすべての数字を検索し、それらを2倍にした値で置換します。
6 */
7function demonstratePregReplaceCallback(): void
8{
9    // 置換対象の元の文字列
10    $originalString = "商品Aの価格は1200円、商品Bの価格は500円です。合計は1700円です。";
11    echo "元の文字列: " . $originalString . PHP_EOL;
12
13    // 正規表現パターン: 1つ以上の数字にマッチします
14    // 'g'フラグがないため、デフォルトで文字列全体で検索し、全てのマッチを処理します。
15    $pattern = '/\d+/';
16
17    // preg_replace_callback を使用して置換を実行します。
18    // マッチした各数字に対してコールバック関数が実行されます。
19    $replacedString = preg_replace_callback(
20        $pattern,
21        function (array $matches): string {
22            // $matches はマッチした部分文字列の配列です。
23            // $matches[0] はパターン全体にマッチした文字列です。
24            $matchedNumber = (int) $matches[0]; // マッチした数字を整数に変換
25            $doubledNumber = $matchedNumber * 2; // 数字を2倍にする
26
27            return (string) $doubledNumber; // 2倍にした数字を文字列として返します
28        },
29        $originalString
30    );
31
32    // 置換後の文字列を出力します
33    if ($replacedString !== null) {
34        echo "置換後の文字列: " . $replacedString . PHP_EOL;
35    } else {
36        echo "置換中にエラーが発生しました。" . PHP_EOL;
37    }
38}
39
40// 関数を実行します
41demonstratePregReplaceCallback();
42
43?>

preg_replace_callback関数は、文字列内で正規表現にマッチした部分を、コールバック関数の処理結果を用いて動的に置換するために使用されます。このサンプルコードでは、商品価格情報を含む元の文字列からすべての数字を見つけ出し、それらの数字を2倍にした値で置き換える具体的な方法を示しています。

コードの中では、まず元の文字列と「一つ以上の数字」にマッチする正規表現パターン/\d+/を定義しています。preg_replace_callback関数は、第一引数にこの正規表現パターン、第二引数にマッチした部分に対して実行されるコールバック関数(ここでは無名関数)、第三引数に置換対象の文字列を受け取ります。

コールバック関数は、正規表現にマッチした各部分ごとに呼び出されます。この関数には、マッチした部分文字列を格納した配列$matchesが引数として渡されます。$matches[0]にはパターン全体にマッチした文字列が含まれます。サンプルでは、この$matches[0]を整数に変換し、2倍にした後、最終的に文字列として返しています。このコールバック関数が返した文字列が、元の文字列のマッチした部分に置き換えられることで、動的な置換が実現されます。

preg_replace_callback関数は、置換が成功した場合は処理後の文字列を返します。もし置換処理中にエラーが発生した場合はnullを返すため、結果のチェックを行うことが推奨されます。この関数を使用することで、固定の文字列ではなく、マッチした内容に応じた柔軟な置換処理が可能になります。

preg_replace_callbackは、正規表現にマッチした部分に対して動的な処理を適用する際に利用します。コールバック関数の引数$matchesには、正規表現のマッチ結果が配列として渡され、$matches[0]がパターン全体にマッチした文字列です。このコールバック関数は、置換結果となる文字列を必ず返してください。数値を操作する場合でも、最終的には文字列に変換して返す必要があります。また、正規表現のパターンに誤りがあるなど内部エラーが発生すると、preg_replace_callbacknullを返します。そのため、結果がnullでないか必ず確認し、適切なエラーハンドリングを実装してください。意図通りの置換を行うためには、正規表現のパターン(例: /\d+/)を正確に理解することが重要です。

PHP preg_replaceで複数置換する

1<?php
2
3/**
4 * 指定された複数の正規表現パターンに基づいて、テキスト内の文字列を置換します。
5 * システムエンジニアを目指す初心者が、preg_replace関数で複数の置換を一度に行う方法を理解するためのサンプルです。
6 *
7 * @param string $subject 置換処理を行う元の文字列。
8 * @return string 置換が実行された後の新しい文字列。
9 */
10function performMultipleReplacements(string $subject): string
11{
12    // 置換する複数のパターンを配列で定義します。
13    // ここでは、特定の果物の名前(大文字・小文字を区別しない)をターゲットにしています。
14    $patterns = [
15        '/\bapple\b/i',   // 'apple'という単語全体を大文字・小文字を区別せずにマッチ
16        '/\borange\b/i',  // 'orange'という単語全体を大文字・小文字を区別せずにマッチ
17        '/\bbanana\b/i'  // 'banana'という単語全体を大文字・小文字を区別せずにマッチ
18    ];
19
20    // 各パターンに対応する置換後の文字列を配列で定義します。
21    // $patterns配列の最初の要素は$replacements配列の最初の要素で置換され、以下同様にペアで処理されます。
22    $replacements = [
23        'grape',  // 'apple'を'grape'に置換
24        'mango',  // 'orange'を'mango'に置換
25        'kiwi'    // 'banana'を'kiwi'に置換
26    ];
27
28    // preg_replace関数を使用して、複数のパターンと置換を一度に実行します。
29    // $patternsと$replacementsに配列を渡すことで、複数の置換ルールが適用されます。
30    // 第5引数の$countは、実際に置換が行われた回数を格納する変数です(オプション)。
31    $replacedString = preg_replace($patterns, $replacements, $subject, -1, $count);
32
33    echo "元の文字列: " . $subject . "\n";
34    echo "置換後の文字列: " . $replacedString . "\n";
35    echo "実行された置換回数: " . $count . "\n";
36
37    return $replacedString;
38}
39
40// サンプルコードの実行
41$originalText1 = "I have an Apple, an Orange, and a Banana. Apple pie is delicious.";
42performMultipleReplacements($originalText1);
43
44echo "\n"; // 出力の区切り
45
46$originalText2 = "The fruit basket contains Apple, Orange, and Banana.";
47performMultipleReplacements($originalText2);
48
49?>

PHPのpreg_replace関数は、指定された正規表現パターンに基づいて文字列内のテキストを置換するための関数です。このサンプルコードは、複数の正規表現パターンと置換文字列を一度に適用して、テキストを一括で処理する方法を示しています。

performMultipleReplacements関数では、まず置換したい複数の正規表現パターンを$patternsという配列に定義します。ここでは、/\bapple\b/iのように、特定の単語(例:apple)を大文字・小文字を区別せずにマッチさせる正規表現が使われています。次に、これらのパターンに対応する置換後の文字列を$replacementsという配列に定義します。$patterns配列の最初の要素は$replacements配列の最初の要素で置換され、以下同様にペアで処理されます。

preg_replace関数を呼び出す際、最初の引数$pattern$patterns配列、二番目の引数$replacement$replacements配列、三番目の引数$subjectに元の文字列を渡します。このように配列を渡すことで、複数の置換ルールが同時に適用されます。第四引数の$limitは置換回数の上限を指定し、-1は無制限を意味します。第五引数の$countはオプションで、実際に置換が行われた合計回数を格納するために使用されます。

この関数は、置換が実行された新しい文字列を返します。もし置換が全く行われなかったり、エラーが発生したりした場合は、nullが返されることがあります。この方法により、複雑なテキスト処理も簡潔に記述できます。

preg_replaceで複数の置換を行う際、$pattern$replacement引数に配列を渡します。これらの配列の要素は、先頭から順番に対応して置換処理されます。$replacement配列の要素が$pattern配列よりも少ない場合、残りのパターンは空文字列で置換されるため、配列の要素数には注意が必要です。パターンは正規表現として扱われ、/などのデリミタで囲み、iで大文字・小文字を区別しない、\bで単語の区切りを指定できます。関数が失敗した場合、nullを返すことがあるため、戻り値の確認は重要です。また、&$count引数を使用すると、実際に置換された合計回数を取得できます。

関連コンテンツ

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