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

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

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

作成日: 更新日:

基本的な使い方

mb_strrpos関数は、指定された文字列の中から、特定の部分文字列が最後に現れる位置を、文字単位で検索し、その開始位置(オフセット)を返す関数です。この関数の大きな特徴は、日本語のようなマルチバイト文字を含む文字列を正確に扱える点にあります。通常のstrrpos関数が文字列をバイト単位で処理するのに対し、mb_strrpos関数は文字単位で処理するため、マルチバイト文字を含む文字列であっても文字化けや意図しない位置ずれを心配することなく、安全かつ正確な検索が可能です。

検索対象となる文字列は$haystack引数で、検索したい部分文字列は$needle引数で指定します。オプションとして$offset引数で検索を開始する位置を文字単位で指定できます。$offsetが正の値の場合、検索は文字列の先頭からその文字数分進んだ位置から開始され、文字列の先頭方向に向かって行われます。$offsetが負の値の場合、検索は文字列の末尾からその文字数分戻った位置から開始され、文字列の先頭方向に向かって行われます。また、$encoding引数を用いて、検索に使用する文字エンコーディングを明示的に指定することも可能です。これを指定しない場合、PHPの内部エンコーディング設定が自動的に適用されます。

部分文字列が見つかった場合、mb_strrpos関数は0から始まるその開始位置を整数で返します。もし部分文字列が見つからなかった場合は、falseが返されます。この関数は、例えばファイルパスから拡張子を抽出する際に、最後のドットの位置を特定したり、URL文字列の最後のスラッシュの位置を見つけてパスを分割したりするなど、マルチバイト文字列を扱う多様な場面で非常に有用です。正確な文字列操作が求められるWebアプリケーション開発において、mb_strrpos関数は不可欠なツールの一つと言えます。

構文(syntax)

1<?php
2$haystack = "プログラミング言語のPHPは素晴らしい言語です。";
3$needle = "言語";
4$offset = 0; // 検索を開始する位置(バイト数ではなく文字数オフセットで指定することも可能だが、ここでは一般的なバイトオフセットとして扱う)
5$encoding = 'UTF-8'; // 使用する文字エンコーディング
6
7// $haystack 内で $needle が最後に出現する位置を検索
8// 見つかった場合はその位置(0から始まるオフセット)、見つからない場合は false を返す
9$lastPosition = mb_strrpos($haystack, $needle, $offset, $encoding);
10
11if ($lastPosition !== false) {
12    echo "文字列 '{$needle}' は '{$haystack}' の最後の位置 {$lastPosition} で見つかりました。\n";
13} else {
14    echo "文字列 '{$needle}' は '{$haystack}' の中に見つかりませんでした。\n";
15}
16?>

引数(parameters)

string $haystack, string $needle, int $offset = 0, ?string $encoding = null

  • string $haystack: 検索対象の文字列
  • string $needle: 検索する文字列
  • int $offset = 0: 検索を開始する位置(省略可能、デフォルトは文字列の末尾から)
  • ?string $encoding = null: 文字エンコーディングの指定(省略可能、デフォルトは内部エンコーディング)

戻り値(return)

int|false

指定された文字が文字列内で最後に出現する位置を数値で返します。見つからない場合はfalseを返します。

サンプルコード

PHP mb_strrpos でマルチバイト文字の末尾位置を検索する

1<?php
2
3/**
4 * PHP mb_strrpos 関数の使用例
5 *
6 * mb_strrposは、マルチバイト文字列において、指定した部分文字列が最後に現れる位置を検索します。
7 * 検索は大文字・小文字を区別します。システムエンジニアを目指す初心者向けに、基本的な使い方を示します。
8 *
9 * PHP 8 で動作確認済み。
10 */
11function demonstrateMbStrrpos(): void
12{
13    // mb_strrposが正しくマルチバイト文字を処理するために、
14    // PHPの内部エンコーディングを適切に設定することが重要です。
15    // 通常はphp.iniで設定しますが、スクリプトの先頭で一時的に設定することもできます。
16    mb_internal_encoding("UTF-8");
17
18    // 検索対象の文字列(マルチバイト文字を含む)
19    $haystack = "こんにちは世界、PHPは素晴らしい世界です。";
20    echo "検索対象文字列: '{$haystack}'\n";
21
22    // 検索する部分文字列
23    $needle = "世界";
24
25    // ----------------------------------------------------
26    // 1. 基本的な使い方:部分文字列が最後に現れる位置を検索
27    // ----------------------------------------------------
28    $position = mb_strrpos($haystack, $needle);
29
30    if ($position !== false) {
31        echo "1. '{$needle}' が最後に現れる位置: {$position} (0から数える文字オフセット)\n";
32        // 例: 'こんにちは世界、PHPは素晴らしい世界です。'
33        // '世界'はインデックス5と17に現れます。mb_strrposは最後に現れる17を返します。
34    } else {
35        echo "1. '{$needle}' は見つかりませんでした。\n";
36    }
37
38    echo "----------------------------------------------------\n";
39
40    // ----------------------------------------------------
41    // 2. 部分文字列が見つからない場合
42    // ----------------------------------------------------
43    $nonExistentNeedle = "存在しない単語";
44    $positionNotFound = mb_strrpos($haystack, $nonExistentNeedle);
45
46    if ($positionNotFound !== false) {
47        echo "2. '{$nonExistentNeedle}' が最後に現れる位置: {$positionNotFound}\n";
48    } else {
49        echo "2. '{$nonExistentNeedle}' は見つかりませんでした。(falseが返されます)\n";
50    }
51
52    echo "----------------------------------------------------\n";
53
54    // ----------------------------------------------------
55    // 3. 検索開始位置 (オフセット) の指定
56    //    オフセットは検索を開始する文字列の開始位置を指定します。
57    //    負のオフセットは文字列の末尾から数えた位置を示します。
58    // ----------------------------------------------------
59    $offsetHaystack = "foo bar foo baz";
60    $offsetNeedle = "foo";
61    echo "検索対象文字列: '{$offsetHaystack}'\n";
62    echo "検索する部分文字列: '{$offsetNeedle}'\n";
63
64    // 全体から最後の 'foo' を検索
65    $posFull = mb_strrpos($offsetHaystack, $offsetNeedle);
66    echo "3.1. オフセットなし: {$posFull} (最後の'foo'の位置。この場合は8)\n";
67
68    // オフセット9から検索を開始: 文字列の9文字目以降 ('oo baz') から 'foo' を探す
69    // この範囲では 'foo' は見つからないため、falseが返されます。
70    $posFromOffset = mb_strrpos($offsetHaystack, $offsetNeedle, 9);
71    echo "3.2. オフセット9から検索開始: ";
72    if ($posFromOffset !== false) {
73        echo "{$posFromOffset}\n";
74    } else {
75        echo "見つかりませんでした。(検索開始位置より前の'foo'は対象外)\n";
76    }
77
78    // 負のオフセット: 末尾から数えて-5の位置(文字列の約10文字目)から検索を開始
79    // 'foo bar foo baz' の長さは 15。オフセット-5は、15-5=10のインデックスから検索を開始します。
80    // 10文字目以降の文字列は 'o baz' となります。この範囲には 'foo' が含まれないため、見つかりません。
81    $posNegativeOffset = mb_strrpos($offsetHaystack, $offsetNeedle, -5);
82    echo "3.3. オフセット-5から検索開始: ";
83    if ($posNegativeOffset !== false) {
84        echo "{$posNegativeOffset}\n";
85    } else {
86        echo "見つかりませんでした。(検索開始位置が末尾から限定されたため)\n";
87    }
88
89    echo "----------------------------------------------------\n";
90
91    // ----------------------------------------------------
92    // 4. エンコーディング引数の利用例
93    //    php.iniのmbstring.internal_encodingが適切に設定されていれば不要ですが、
94    //    明示的に指定することもできます。
95    // ----------------------------------------------------
96    $encodingHaystack = "サンプルテキスト";
97    $encodingNeedle = "テキスト";
98    $posEncoding = mb_strrpos($encodingHaystack, $encodingNeedle, 0, 'UTF-8');
99
100    echo "検索対象文字列: '{$encodingHaystack}'\n";
101    echo "検索する部分文字列: '{$encodingNeedle}'\n";
102    echo "4. '{$encodingNeedle}' が最後に現れる位置 (UTF-8指定): {$posEncoding}\n"; // 4 (0から数える)
103}
104
105// demonstrateMbStrrpos 関数を呼び出して実行例を表示
106demonstrateMbStrrpos();
107

mb_strrpos関数は、PHP 8で利用可能な関数で、マルチバイト文字列において、指定した部分文字列が最後に現れる位置を検索するために使用されます。検索は大文字・小文字を区別して行われます。

この関数は、以下の引数を取ります。

  • $haystack: 検索対象となる元の文字列です。
  • $needle: 検索したい部分文字列です。
  • $offset(オプション): 検索を開始する文字列内の位置(文字数)を指定します。デフォルトは0で、文字列の先頭から検索します。負の値を指定すると、文字列の末尾から数えた位置から検索を開始します。
  • $encoding(オプション): 検索に使用する文字エンコーディングを指定します。省略された場合は、PHPの内部エンコーディングが使用されます。

部分文字列が見つかった場合、mb_strrpos関数は、その部分文字列が最後に現れる位置を0から始まる文字オフセットで返します。例えば、「こんにちは世界、PHPは素晴らしい世界です。」という文字列で「世界」を検索すると、最後に見つかる「世界」の位置である17を返します。もし部分文字列が見つからなかった場合はfalseを返します。

マルチバイト文字(日本語など)を正しく処理するためには、mb_internal_encoding()関数やphp.iniの設定で、適切な内部エンコーディング(例えば「UTF-8」)を設定することが重要です。この設定により、文字単位での正確な処理が可能となります。サンプルコードでは、検索する文字列、見つからない場合の処理、オフセットを指定した検索、エンコーディングを明示する例が示されています。

mb_strrpos関数を利用する際は、まずmb_internal_encodingを適切に設定し、マルチバイト文字が正しく処理されるようにすることが重要です。この関数の戻り値は、部分文字列が見つからない場合にfalseを返しますので、結果を比較する際は!== falseのように厳密な比較を行うことを強く推奨します。offset引数は検索開始位置を文字列の先頭から指定し、負の値を指定すると末尾から数えた位置から検索範囲を限定します。本関数は大文字・小文字を区別して検索を行いますので、区別しない検索が必要な場合はmb_striposなどの関数を検討してください。また、検索結果のインデックスは0から始まることを理解しておきましょう。encoding引数を明示的に指定することも可能ですが、mb_internal_encodingが適切に設定されていれば省略しても問題ありません。

PHP mb_strrpos で文字列の末尾位置を取得する

1<?php
2
3/**
4 * mb_strrpos 関数の基本的な使用例
5 *
6 * この関数は、マルチバイト文字列内で指定された部分文字列が最後に現れる位置を返します。
7 * 主に日本語のようなマルチバイト文字を含む文字列を扱う際に、正確な位置検索が可能です。
8 *
9 * @param string $haystack 検索対象の文字列。
10 * @param string $needle 検索する部分文字列。
11 * @param int $offset (オプション) 検索を開始するオフセット。負の値も指定可能。
12 * @return int|false 部分文字列が見つかった場合はその位置 (0から始まるバイト数)、見つからない場合は false。
13 */
14function demonstrateMbStrrpos(): void
15{
16    // 検索対象となるマルチバイト文字列を定義
17    $fullString = "こんにちは、世界!PHPは素晴らしい言語です。PHPの世界へようこそ。";
18
19    // 検索する部分文字列を定義
20    $searchWord = "世界";
21
22    echo "検索対象の文字列: '{$fullString}'\n";
23    echo "検索するキーワード: '{$searchWord}'\n\n";
24
25    // 1. 基本的な使用法: 文字列中で最後に「世界」が現れる位置を検索
26    $lastPos = mb_strrpos($fullString, $searchWord);
27
28    if ($lastPos !== false) {
29        echo "基本的な検索: '{$searchWord}' は、文字列の最後に位置 {$lastPos} (0から数えて) で見つかりました。\n";
30        // 見つかった部分文字列の前後を表示して確認
31        echo "該当部分: '" . mb_substr($fullString, $lastPos, mb_strlen($searchWord)) . "'\n\n";
32    } else {
33        echo "基本的な検索: '{$searchWord}' は文字列中に見つかりませんでした。\n\n";
34    }
35
36    // 2. オフセットを指定した使用法: 最初の10文字以降で最後に「世界」が現れる位置を検索
37    $offset = 10;
38    $lastPosWithOffset = mb_strrpos($fullString, $searchWord, $offset);
39
40    echo "オフセット {$offset} からの検索: '{$searchWord}'\n";
41    if ($lastPosWithOffset !== false) {
42        echo "オフセット指定: '{$searchWord}' は、文字列の最後に位置 {$lastPosWithOffset} (0から数えて) で見つかりました。\n";
43        echo "該当部分: '" . mb_substr($fullString, $lastPosWithOffset, mb_strlen($searchWord)) . "'\n\n";
44    } else {
45        echo "オフセット指定: オフセット {$offset} 以降では '{$searchWord}' は見つかりませんでした。\n\n";
46    }
47
48    // 3. 見つからない場合の例
49    $nonExistentWord = "Python";
50    $notFoundPos = mb_strrpos($fullString, $nonExistentWord);
51
52    echo "見つからないキーワード: '{$nonExistentWord}'\n";
53    if ($notFoundPos !== false) {
54        echo "'{$nonExistentWord}' は、文字列の最後に位置 {$notFoundPos} で見つかりました。\n";
55    } else {
56        echo "'{$nonExistentWord}' は文字列中に見つかりませんでした。\n\n";
57    }
58}
59
60// 関数を実行
61demonstrateMbStrrpos();
62

PHPのmb_strrpos関数は、日本語のようなマルチバイト文字を含む文字列において、指定した部分文字列が「最後」に出現する位置を検索するために利用されます。通常のstrrpos関数では、マルチバイト文字を正確に扱えないため、mb_strrposを使用することで、文字化けや誤った位置の検出を防ぎ、正確な文字列処理が可能になります。

このサンプルコードでは、"こんにちは、世界!PHPは素晴らしい言語です。PHPの世界へようこそ。"という検索対象の文字列($haystack)から、"世界"という部分文字列($needle)を探す例を通じて、mb_strrpos関数の使い方を解説しています。

基本的な使用例では、mb_strrpos($fullString, $searchWord)のように引数を渡すことで、$searchWord$fullString内で最後に見つかった位置が0から始まるバイト数で返されます。もし部分文字列が見つからない場合は、戻り値としてfalseが返されるため、結果は!== falseで厳密に確認することが重要です。

また、3番目の引数$offsetを使用すると、検索を開始する位置を指定できます。例えば、mb_strrpos($fullString, $searchWord, 10)とすることで、「文字列の先頭から10バイト目以降で、最後に出現する"世界"」を検索することが可能です。これにより、特定の範囲内でのみ検索を行うといった柔軟な処理が実現できます。

最後に、存在しない部分文字列"Python"を検索する例では、期待通りfalseが返され、部分文字列が見つからなかったことを示しています。mb_strrpos関数は、マルチバイト文字の文字列操作において、特定のキーワードの最後の出現位置を効率的かつ正確に特定するために非常に役立つ関数です。

mb_strrpos関数は、マルチバイト文字を含む文字列において、指定された部分文字列が最後に現れる文字位置を正確に検索します。検索結果が見つからない場合はfalseを返しますので、戻り値は必ず!== falseのように厳密に比較してください。0も有効な開始位置を示すため、if ($pos)のような単純な条件式は避けてください。第4引数でエンコーディングを明示的に指定すると、文字化けや意図しない結果を防ぎ、より安全に利用できます。日本語のようなマルチバイト文字を扱う際には、通常のstrrposではなく、このmb_strrpos関数を用いることが重要です。これにより、文字数計算の誤りを防ぐことができます。

関連コンテンツ

関連プログラミング言語