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

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

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

作成日: 更新日:

基本的な使い方

substr_replace関数は、文字列の一部を指定した別の文字列で置き換えるための関数です。この関数は、与えられた文字列の特定の位置から指定された長さの範囲を、新しい文字列に置き換える処理を実行します。

具体的には、この関数は四つの引数を受け取ります。最初の引数には、置き換えの対象となる元の文字列を指定します。二番目の引数には、置き換えとして挿入する新しい文字列を指定します。三番目の引数には、置き換えを開始する位置を数値で指定します。この開始位置は文字列の先頭を0として数え、負の値を指定した場合は文字列の末尾から数えた位置になります。四番目の引数には、置き換える文字の長さを数値で指定します。この長さを省略した場合や、指定した長さが文字列の残りの部分よりも長い場合は、開始位置から文字列の最後までが置き換えの対象となります。また、長さに負の値を指定すると、文字列の末尾から数えた長さを除いた部分が置き換えの対象となります。

この関数は、置き換えが完了した新しい文字列を返します。元の文字列自体が変更されることはありませんので、必要に応じて戻り値を新しい変数に代入して利用します。例えば、ユーザーの入力した文字列の一部を修正したり、特定の情報をマスクしたりする場合など、多様な文字列操作の場面で活用できる機能です。シンプルながらも非常に柔軟な文字列操作を実現できるため、プログラミングにおいて頻繁に利用されます。

構文(syntax)

1<?php
2
3// 文字列の一部を、別の文字列で置換する
4$result = substr_replace(
5    $string,      // 置換対象の文字列
6    $replacement, // 置換後の文字列
7    $start,       // 置換を開始する位置 (0から始まるインデックス)
8    $length       // 置換する文字数 (省略可能)
9);

引数(parameters)

array|string $string, array|string $replace, array|int $offset, array|int|null $length = null

  • string|array $string: 処理対象となる文字列または文字列の配列
  • string|array $replace: 置換する文字列または置換文字列の配列
  • int|array $offset: $string のどの位置から置換を開始するかを指定する整数、またはオフセットの配列
  • int|null|array $length = null: $string の $offset から置換する文字数を指定する整数、または文字数の配列。null を指定すると、$offset から文字列の最後まで置換します。

戻り値(return)

string|array|null

指定された文字列の一部を別の文字列に置き換えた結果を返します。置換が正常に行われた場合は文字列、置換対象が配列で部分的に置換された場合は配列、エラーが発生した場合はnullを返します。

サンプルコード

php substr_replaceで文字列を置換・挿入する

1<?php
2
3/**
4 * substr_replace関数の基本的な使い方を示すサンプルコードです。
5 * この関数は、文字列の一部を指定した文字列で置換、挿入、または上書きするために使用されます。
6 *
7 * @param string $string   元の文字列。
8 * @param string $replace  挿入または置換する文字列。
9 * @param int    $offset   置換を開始する位置。0は文字列の先頭。負の値は末尾からの位置。
10 * @param int|null $length 置換する文字数。nullの場合は$offset以降のすべてを置換。0の場合は挿入。
11 *                         負の値は文字列の末尾からその位置までの文字数を置換。
12 * @return string 置換後の文字列。
13 */
14
15// 元の文字列を定義します。
16$originalString = "Hello World!";
17echo "元の文字列: " . $originalString . PHP_EOL . PHP_EOL;
18
19// 例1: 特定の位置から特定の長さの文字列を別の文字列で置換する
20// 6番目の文字('W')から5文字("World")を"PHP"に置換します。
21$replacedString1 = substr_replace($originalString, "PHP", 6, 5);
22echo "例1 (置換):      " . $replacedString1 . PHP_EOL; // 結果: Hello PHP!
23
24// 例2: 文字列を挿入する(置換する長さ(length)を0に設定)
25// 6番目の文字('W')の前に"Beautiful "を挿入します。
26$insertedString = substr_replace($originalString, "Beautiful ", 6, 0);
27echo "例2 (挿入):      " . $insertedString . PHP_EOL; // 結果: Hello Beautiful World!
28
29// 例3: オフセットに負の値を指定して末尾から置換する
30// 末尾から6文字目('W')から5文字("World")を"Universe"に置換します。
31$replacedString2 = substr_replace($originalString, "Universe", -6, 5);
32echo "例3 (負のオフセット): " . $replacedString2 . PHP_EOL; // 結果: Hello Universe!
33
34// 例4: 長さを指定しない(またはnullを指定)場合、オフセット以降の全てを置換する
35// 6番目の文字('W')から最後までを"PHP"に置換します。
36$replacedString3 = substr_replace($originalString, "PHP", 6);
37echo "例4 (最後まで置換): " . $replacedString3 . PHP_EOL; // 結果: Hello PHP

PHPのsubstr_replace関数は、元の文字列の一部を指定した文字列で置換、挿入、または上書きするために使用されます。この関数は、変更後の文字列を新しい文字列として返します。

引数には、元の文字列 $string、挿入または置換する文字列 $replace、そして置換を開始する位置を示す $offset を指定します。$offset が0の場合は文字列の先頭から、正の値を指定すると先頭からの位置、負の値を指定すると文字列の末尾からの位置を示します。さらに、置換する文字数を示す $length を指定することができます。$length を省略するか null にすると $offset 以降のすべての文字が置換され、0を指定すると置換は行われず $replace の文字列が挿入されます。負の値を指定すると、文字列の末尾からその位置までの文字数が置換されます。

このサンプルコードでは、まず元の文字列「Hello World!」を用意しています。

最初の例では、substr_replace($originalString, "PHP", 6, 5) のように、6番目の文字('W')から5文字分の「World」を「PHP」に置き換え、「Hello PHP!」という結果を得ています。

次に、substr_replace($originalString, "Beautiful ", 6, 0) のように $length を0に設定することで、6番目の文字の位置に「Beautiful 」を挿入し、「Hello Beautiful World!」となります。

三つ目の例では、$offset に負の値である -6 を指定し、末尾から数えて6文字目から5文字分の「World」を「Universe」に置き換え、「Hello Universe!」という文字列を生成しています。

最後の例では、substr_replace($originalString, "PHP", 6) のように $length を省略することで、6番目の文字以降のすべての文字列「World!」を「PHP」に置き換え、「Hello PHP」という結果を示しています。このように、substr_replace関数は文字列操作において柔軟な機能を提供します。

substr_replace関数は、文字列の一部を指定した文字列で置き換えたり、特定の場所に文字列を挿入したりする際に利用します。特に、どの位置からどれくらいの範囲を操作するかの指定が重要です。$offset引数で開始位置を指定しますが、0は文字列の先頭、負の値は末尾からの位置を示します。また、$length引数を0にすると文字列の挿入になり、省略するかnullを指定すると$offset以降のすべてを置換します。これらの引数の使い方によって関数の挙動が大きく変わるため、それぞれの意味を正確に理解して使い分けることが重要です。元の文字列や置換する文字列の引数に配列を渡すことも可能で、その場合は戻り値も配列になりますので、想定と異なる型を受け取らないようご注意ください。

PHP substr_replaceで最後の文字を置換する

1<?php
2
3/**
4 * substr_replace() を使用して文字列の最後の文字を置換するサンプル
5 *
6 * @param string $originalString 元の文字列
7 * @param string $replacement 置換する新しい文字
8 * @return string 最後の文字が置換された新しい文字列
9 */
10function replaceLastCharacter(string $originalString, string $replacement): string
11{
12    // 第3引数 (offset) に負の値を指定すると、文字列の末尾から数えた位置になります。
13    // -1 は、末尾から1文字目、つまり最後の文字を指します。
14    // 第4引数 (length) を指定しない場合、offset以降のすべての文字が置換されます。
15    // offsetが-1の場合、結果的に最後の1文字だけが置換対象となります。
16    return substr_replace($originalString, $replacement, -1);
17}
18
19// 対象の文字列
20$text = 'Hello World!';
21
22// 置換したい文字
23$newChar = '.';
24
25// 関数を呼び出して最後の文字を置換する
26$result = replaceLastCharacter($text, $newChar);
27
28// 結果を出力する
29echo "元の文字列: " . $text . PHP_EOL;
30echo "置換後の文字列: " . $result . PHP_EOL;
31
32?>

このPHPコードは、substr_replace関数を使用して、指定された文字列の最後の文字を別の文字に置き換える方法を示したサンプルです。

substr_replace関数は、文字列の一部を別の文字列で置き換えるための関数です。第1引数には処理対象の文字列、第2引数には置き換える新しい文字列、第3引数には置換を開始する位置(オフセット)、そして第4引数には置き換える長さを指定します。

このサンプルコードの重要な点は、第3引数のオフセットに-1を指定していることです。オフセットに負の値を指定すると、文字列の末尾から逆方向に数えた位置が開始点となります。そのため、-1は文字列の最後の文字を指します。

また、第4引数である置換する文字の長さは省略されています。この引数を省略した場合、オフセットで指定した位置から文字列の最後までが置換の対象範囲となります。今回はオフセットが-1(最後の文字)なので、結果的に最後の1文字だけが新しい文字に置き換わります。

コード内のreplaceLastCharacter関数は、これらの仕組みを利用して、元の文字列と置換文字を受け取り、最後の文字を置換した新しい文字列を戻り値として返します。実行例では、'Hello World!'の最後の'!''.'に置き換えられ、'Hello World.'と出力されます。

substr_replace関数の第3引数に-1のような負の値を指定すると、文字列の末尾から数えた位置が処理の開始点となります。このサンプルでは、-1を指定することで最後の1文字を対象にしています。最も重要な注意点は、この関数が日本語などのマルチバイト文字を正しく扱えないことです。1バイト単位で文字列を処理するため、マルチバイト文字に使用すると文字化けの原因となります。安全に日本語を扱うには、mb_substr関数などを使って代替処理を実装する必要があります。また、第4引数の長さを省略すると、開始位置から文字列の末尾まで全てが置換されます。例えば第3引数を-2にすると最後の2文字が置換されるため、意図した範囲だけを置換できているか確認することが大切です。元の文字列が空の場合、置換文字列がそのまま返される点にも留意してください。

PHP substr_replaceによる文字列操作

1<?php
2
3/**
4 * substr_replace関数の基本的な使用例を示すスクリプト。
5 * 文字列の一部を置換、挿入、または削除する方法をデモンストレーションします。
6 *
7 * 注意: substr_replaceはバイト単位で動作します。
8 * そのため、UTF-8などのマルチバイト文字を含む文字列を扱う際には、
9 * オフセットや長さをバイト数で指定する必要があります。
10 * バイト数を誤ると、文字が壊れる可能性があります。
11 */
12
13// 元の文字列 (ASCII)
14$originalString = "Hello World!";
15echo "元の文字列 (ASCII): " . $originalString . PHP_EOL;
16
17// 1. 基本的な置換: "World" を "PHP" に置き換える
18// 6文字目(インデックス5)から5文字を置き換える
19$replacedString1 = substr_replace($originalString, "PHP", 6, 5);
20echo "1. 基本的な置換 (6文字目から5文字): " . $replacedString1 . PHP_EOL; // 出力: Hello PHP!
21
22// 2. 文字列の挿入: "Hello" の後に "Beautiful " を挿入する
23// 5文字目(インデックス5)から0文字を置き換え、文字列を挿入
24$insertedString = substr_replace($originalString, "Beautiful ", 5, 0);
25echo "2. 文字列の挿入 (5文字目に挿入): " . $insertedString . PHP_EOL; // 出力: Hello Beautiful World!
26
27// 3. 文字列の削除: " World" の部分を削除する
28// 5文字目(インデックス5)から6文字を空文字列で置き換える
29$deletedString = substr_replace($originalString, "", 5, 6);
30echo "3. 文字列の削除 (5文字目から6文字を削除): " . $deletedString . PHP_EOL; // 出力: Hello!
31
32// 4. 負のオフセット: 文字列の終わりから数える
33// 終わりから6文字目("World!")の位置から、3文字("Wor")を"New"に置き換える
34$negativeOffsetString = substr_replace($originalString, "New", -6, 3);
35echo "4. 負のオフセット (-6から3文字): " . $negativeOffsetString . PHP_EOL; // 出力: Hello Newld!
36
37// 5. 負の長さ: 指定したオフセットから、終わりから指定した文字数分を残して置換する
38// 6文字目から、終わりから1文字を残して全て置き換える
39$negativeLengthString = substr_replace($originalString, "PHP", 6, -1);
40echo "5. 負の長さ (6から終わりから1文字残す): " . $negativeLengthString . PHP_EOL; // 出力: Hello PHPd!
41
42echo PHP_EOL; // 区切り
43
44// UTF-8文字列での使用例
45// PHPのデフォルトエンコーディングがUTF-8であることを前提としています。
46// 多くの日本語文字は3バイトで構成されます。
47$japaneseString = "こんにちは世界!";
48echo "元の文字列 (UTF-8): " . $japaneseString . PHP_EOL;
49
50// 6. UTF-8文字列の置換: 「世界」の部分を「PHP」に置き換える
51// 「こんにちは」は5文字ですが、UTF-8では15バイトです (5 * 3バイト)。
52// したがって、「世界」の開始オフセットは15バイト目です。
53// 「世界」は2文字ですが、UTF-8では6バイトです (2 * 3バイト)。
54$replacedJapaneseString = substr_replace($japaneseString, "PHP", 15, 6);
55echo "6. 日本語文字列の置換 (バイト単位での指定): " . $replacedJapaneseString . PHP_EOL; // 出力: こんにちはPHP!
56
57// 注意: 例えば、「こんにちは世」で終わる文字列の「世」の途中から置換するなど、
58// バイト数を誤ると文字化けが発生する可能性があります。
59// 例: substr_replace("こんにちは世界", "PHP", 16, 3) // 「世」の途中から置換を試みるため、文字化けしやすい

substr_replace関数は、指定した文字列の一部を別の文字列で置換、挿入、または削除するために使用されます。

この関数は、主に四つの引数を取ります。最初の$stringには操作対象となる元の文字列を指定し、二番目の$replaceには置き換える新しい文字列を指定します。三番目の$offsetは置換を開始する位置を数値で指定し、正の数は文字列の先頭から、負の数は末尾からの位置を示します。最後の$lengthは置換する文字(バイト)の長さを数値で指定します。$length0にすると挿入、nullを指定または省略すると$offset以降全てを置換します。負の値を指定すると、$offsetから文字列の末尾まで、指定された絶対値の文字数を残して置換します。この関数は、処理後の新しい文字列を返します。

サンプルコードでは、まず"Hello World!"という文字列を用いて基本的な操作を示しています。"World""PHP"に置き換えたり、"Beautiful "を挿入したり、" World"を削除したりしています。負のオフセットや負の長さを利用することで、文字列の末尾から数えて置換位置や長さを指定することも可能です。

特に注意が必要なのは、substr_replace関数が文字数ではなくバイト単位で動作する点です。日本語のようなマルチバイト文字を含むUTF-8文字列を扱う際には、オフセットや長さをバイト数で正確に指定しなければなりません。例えば、"こんにちは世界!""世界""PHP"に置換する例では、"こんにちは"が15バイト、"世界"が6バイトであるため、開始オフセットを15、長さを6と指定しています。バイト数を誤ると文字化けの原因となるため、UTF-8文字列の取り扱いには十分な注意が必要です。

substr_replace関数は、文字列の一部を別の文字列で置換、挿入、または削除するために使用します。この関数の最大の注意点は、オフセットと長さがバイト単位で処理されることです。

そのため、UTF-8などのマルチバイト文字(日本語など)を含む文字列を扱う場合、文字数でなくバイト数でオフセットや長さを指定しなければ、文字化けや予期せぬ結果が発生する危険性があります。特に初心者は、この点を見落としがちです。

マルチバイト文字列を安全に、かつ直感的に文字数で処理したい場合は、PHPのマルチバイト文字列関数であるmb_substr_replaceの利用を強く推奨します。バイト単位での指定が難しい場合は、必ずmb_*系の関数を活用してください。

関連コンテンツ

関連プログラミング言語

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