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

【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 * preg_replace 関数のデフォルトである「全ての一致を置換する(グローバルマッチ)」動作を示すサンプル関数です。
5 *
6 * PHPのpreg_replaceは、正規表現に一致する全ての箇所を置換します。
7 * これは、他のプログラミング言語における正規表現の「グローバルマッチ」フラグ (例: JavaScriptの /g) と同様の動作です。
8 * `$limit` 引数を指定しない、または `-1` を指定した場合、このグローバルな置換動作が適用されます。
9 *
10 * @param string $subject 置換対象の文字列
11 * @return void
12 */
13function demonstratePregReplaceGlobal(string $subject): void
14{
15    echo "元の文字列: " . $subject . PHP_EOL;
16
17    // 置換したいパターン (例: 1つ以上の数字)
18    // ここでは数字の並びを全て探し、'#'に置換します。
19    $pattern = '/\d+/'; // '\d+' は1つ以上の数字にマッチします
20    $replacement = '#';
21
22    // preg_replace はデフォルトで、対象文字列内で見つかる全てのパターンを置換します。
23    // これが「グローバル」な置換動作です。
24    $replacedString = preg_replace($pattern, $replacement, $subject);
25
26    // 置換結果の表示
27    echo "置換後の文字列: " . $replacedString . PHP_EOL;
28
29    // 実際に置換が行われた回数を取得することも可能です。
30    $count = 0;
31    preg_replace($pattern, $replacement, $subject, -1, $count);
32    echo "実際に置換された回数: " . $count . PHP_EOL;
33}
34
35// サンプルコードの実行例
36demonstratePregReplaceGlobal("Order 123 items for customer 456 from store 789.");
37echo PHP_EOL;
38demonstratePregReplaceGlobal("This string contains no numbers.");
39echo PHP_EOL;
40demonstratePregReplaceGlobal("Another example with numbers like 1, 2, and 3.");
41
42?>

preg_replace関数は、正規表現を使用して文字列内の特定のパターンを検索し、別の文字列に置換するために利用されます。PHP 8のこの関数は、デフォルトで対象文字列内で見つかった全てのパターンを置換する「グローバルマッチ」の動作をします。これは、他の言語で正規表現にグローバルフラグ(例: /g)を付けるのと同じ挙動です。

サンプルコードのdemonstratePregReplaceGlobal関数は、このデフォルトのグローバルマッチ動作を示しています。この関数では、$subjectに与えられた文字列から$patternで指定された「1つ以上の数字の並び」(/\d+/)を検索し、$replacementとして指定された#に置換しています。preg_replace関数の第4引数$limitを省略するか-1を指定すると、見つかった全てのマッチが置換されます。

関数の引数としては、$patternに検索する正規表現(文字列または配列)、$replacementに置換後の文字列(文字列または配列)、$subjectに置換対象の文字列(文字列または配列)を指定します。また、第5引数&$countには、実際に置換が行われた回数が整数で格納されます。関数の戻り値は、置換後の文字列(または配列)となります。エラーが発生した場合はnullが返されます。このサンプルは、数字の並びが複数箇所に存在する場合でも、すべてが#に置換されていることを確認できます。

PHPのpreg_replace関数は、正規表現に一致する全ての箇所をデフォルトで置換します。これは「グローバルマッチ」と呼ばれ、他の言語で明示的なフラグが必要な場合と動作が異なるため注意が必要です。特定の回数のみ置換したい場合は、第四引数の$limitに正の数を指定してください。第一引数の$patternは正規表現であり、/などのデリミタで囲む必要があります。これを忘れるとエラーが発生します。また、第五引数の&$countは参照渡しであり、置換が行われた回数を取得できます。関数が失敗した場合はnullを返すことがありますので、結果を必ず確認し、意図しない動作を防ぐようにしましょう。正規表現の記述ミスにも注意し、十分にテストを行ってください。

preg_replace で置換回数を取得する

1<?php
2
3/**
4 * preg_replace 関数を使用して文字列の置換を行い、
5 * マッチした回数を参照渡しで取得するサンプルコードです。
6 *
7 * preg_replace 関数の第5引数 `$count` はデフォルト値が null で、
8 * マッチングおよび置換が成功した回数を格納するために参照渡しで利用されます。
9 */
10function demonstratePregReplaceWithCount(): void
11{
12    // 置換対象となる元の文字列
13    $subject = "Hello World! Hello PHP! Hello Universe!";
14
15    // 検索する正規表現パターン
16    // ここでは "Hello" という単語を検索します。
17    // 'i' 修飾子は、大文字・小文字を区別しない (case-insensitive) 検索を意味します。
18    $pattern = '/Hello/i';
19
20    // 検索パターンにマッチした部分を置き換える文字列
21    $replacement = 'Hi';
22
23    // マッチした回数を格納するための変数
24    // preg_replace の第5引数にこの変数を参照渡しすることで、関数実行後にマッチ回数がこの変数にセットされます。
25    // 変数の初期値は何でも構いませんが、通常は0で初期化します。
26    $matchCount = 0;
27
28    echo "元の文字列: " . $subject . PHP_EOL;
29    echo "検索パターン: " . $pattern . PHP_EOL;
30    echo "置換文字列: " . $replacement . PHP_EOL;
31    echo "----------------------------------------" . PHP_EOL;
32
33    // preg_replace を実行
34    // 第4引数 (limit) は -1 で、すべての一致を置換します。
35    // 第5引数に $matchCount を参照渡し (&$matchCount) することで、
36    // 関数実行後に $matchCount にマッチ回数が格納されます。
37    $result = preg_replace($pattern, $replacement, $subject, -1, $matchCount);
38
39    // preg_replace の戻り値の確認
40    // 成功した場合は置換後の文字列が、エラーが発生した場合は null が返されます。
41    if ($result === null) {
42        echo "エラー: preg_replace の実行中に問題が発生しました。" . PHP_EOL;
43    } else {
44        echo "置換後の文字列: " . $result . PHP_EOL;
45        echo "マッチおよび置換された回数: " . $matchCount . PHP_EOL;
46    }
47}
48
49// 関数を実行して動作を確認します
50demonstratePregReplaceWithCount();

preg_replace関数は、正規表現を使用して文字列内の特定のパターンを検索し、別の文字列に置換するPHPの強力な関数です。PHP 8では、引数や戻り値の型ヒントが明確化されています。

この関数は主に五つの引数を取ります。第一引数$patternには検索する正規表現パターンを、第二引数$replacementにはパターンにマッチした部分を置き換える文字列を指定します。第三引数$subjectは置換の対象となる元の文字列です。第四引数$limitは置換する回数の上限を指定し、デフォルト値の-1はすべての一致を置換することを意味します。

特に重要なのは第五引数&$countです。この引数はマッチングおよび置換が成功した回数を格納するための参照渡し変数で、デフォルト値はnullです。事前に用意した変数をここに参照渡しで指定することで、関数実行後にその変数に実際の置換回数がセットされます。

preg_replaceの戻り値は、置換が成功した場合は置換後の文字列(または配列)を返します。しかし、正規表現パターンが無効な場合など、エラーが発生した際にはnullが返されるため、戻り値の確認は重要です。

サンプルコードでは、「Hello World! Hello PHP! Hello Universe!」という文字列に対し、正規表現/Hello/i(大文字・小文字を区別しない「Hello」を意味します)を検索し、「Hi」に置換しています。この例では$matchCount変数をpreg_replaceの第五引数に参照渡しすることで、関数実行後に3回置換が行われたという結果を取得しています。また、戻り値がnullでないことを確認し、エラーハンドリングも考慮された堅牢な記述となっています。

preg_replace関数では、正規表現パターンの指定方法(例: /Hello/iのような区切り文字と修飾子)を正しく理解することが重要です。特に第5引数&$countは、マッチングおよび置換が成功した回数を取得するために参照渡しで利用します。この引数を使用する際は、必ず事前に変数を準備してください。また、関数の実行中に内部エラーが発生した場合、戻り値がnullとなる点に注意が必要です。置換後の文字列としてnullが返されていないか確認し、適切にエラーハンドリングを行うことで、予期せぬ挙動を防ぎ、プログラムの安定性を高めることができます。

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エンジニア