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

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

作成日: 更新日:

基本的な使い方

strrpos関数は、指定した文字列の中で、ある部分文字列が最後に出現する位置を検索する関数です。

この関数は、最初の引数に検索対象となる文字列を、次の引数に検索したい部分文字列を指定します。部分文字列が検索対象の文字列内で最後に見つかった場合、その位置を0から始まる整数値で返します。もし、検索対象の文字列内に目的の部分文字列が全く見つからなかった場合は、論理値の「false」を返します。

関数の戻り値が「0」であることと「false」であることは異なる意味を持つため、検索結果を確認する際には「===」演算子を使って厳密に比較することが重要です。

strrpos関数は大文字と小文字を区別して検索を行います。大文字小文字を区別せずに検索を行いたい場合は、「strripos」関数を使用してください。また、日本語などのマルチバイト文字を含む文字列を扱う際には、期待通りの結果が得られない可能性があります。より安全にマルチバイト文字を処理できる「mb_strrpos」関数を使用することをお勧めします。オプションとして、検索を開始するオフセット位置を数値で指定することも可能です。

構文(syntax)

1$haystack = "Hello world";
2$needle = "o";
3$position = strrpos($haystack, $needle);

引数(parameters)

string $haystack, string $needle, int $offset = 0

  • string $haystack: 検索対象の文字列
  • string $needle: 検索する文字列
  • int $offset = 0: 検索を開始する位置。省略された場合は、文字列の末尾から検索されます。

戻り値(return)

int|false

指定された文字列が、別の文字列の末尾から検索して最初に見つかった位置を整数で返します。見つからなかった場合は false を返します。

サンプルコード

PHP strrpos() 関数による最後の位置検索

1<?php
2
3/**
4 * strrpos() 関数の様々な使用方法を示すサンプルコード。
5 *
6 * strrpos() は、文字列内で特定の部分文字列が最後に現れる位置(インデックス)を返します。
7 * 検索は大文字小文字を区別し、左から数えて0から始まるインデックスを返します。
8 * 見つからない場合は false を返します。
9 *
10 * strrpos(string $haystack, string $needle, int $offset = 0): int|false
11 *
12 * @param string $haystack 検索対象の文字列
13 * @return void
14 */
15function demonstrateStrrposUsage(string $haystack): void
16{
17    echo "--- strrpos() 関数の使用例 ---\n";
18    echo "元の文字列: \"{$haystack}\"\n";
19    echo "----------------------------------------\n";
20
21    // 1. 基本的な使用例: 文字列内で 'o' が最後に現れる位置を探す
22    $searchChar = "o";
23    $lastPos1 = strrpos($haystack, $searchChar);
24    echo "1. 探す文字: '{$searchChar}'\n";
25    if ($lastPos1 !== false) {
26        echo "   最後の '{$searchChar}' はインデックス {$lastPos1} に見つかりました。\n";
27    } else {
28        echo "   '{$searchChar}' は文字列内に見つかりませんでした。\n";
29    }
30    echo "----------------------------------------\n";
31
32    // 2. 部分文字列が見つからない場合: false が返される
33    $searchNotFound = "xyz";
34    $lastPos2 = strrpos($haystack, $searchNotFound);
35    echo "2. 探す文字列: '{$searchNotFound}'\n";
36    // 厳密な比較 (===) は false と 0 (文字列の先頭) を区別するために重要
37    if ($lastPos2 === false) {
38        echo "   '{$searchNotFound}' は文字列内に見つかりませんでした。(戻り値の型: " . gettype($lastPos2) . ")\n";
39    } else {
40        echo "   最後の '{$searchNotFound}' はインデックス {$lastPos2} に見つかりました。\n";
41    }
42    echo "----------------------------------------\n";
43
44    // 3. 正のオフセットを指定する例: オフセット以降で見つかる最後の位置を探す
45    // オフセット 20 から検索を開始し、それ以降で見つかる最後の 'o' の位置を探す
46    // (つまり、文字列のインデックス20から最後までの中で最後の'o'を探す)
47    $offsetPositive = 20;
48    $lastPos3 = strrpos($haystack, $searchChar, $offsetPositive);
49    echo "3. 探す文字: '{$searchChar}', 正のオフセット: {$offsetPositive}\n";
50    if ($lastPos3 !== false) {
51        echo "   オフセット {$offsetPositive} 以降で見つかった最後の '{$searchChar}' はインデックス {$lastPos3} に見つかりました。\n";
52    } else {
53        echo "   オフセット {$offsetPositive} 以降で '{$searchChar}' は見つかりませんでした。\n";
54    }
55    echo "----------------------------------------\n";
56
57    // 4. ネガティブオフセットを指定する例: 末尾からの指定位置より前で見つかる最後の位置を探す
58    // 文字列の末尾から数えて 10 文字前から検索を開始。
59    // 具体的には、文字列の先頭から (strlen($haystack) + $negativeOffset) - 1 までの範囲内で
60    // 最後に現れる $searchChar を探します。
61    // 例: $haystack の長さが 42 の場合、-10 はインデックス 32 (42-10) を指し、
62    // 検索範囲は $haystack[0...31] となります。
63    $offsetNegative = -10;
64    $lastPos4 = strrpos($haystack, $searchChar, $offsetNegative);
65    echo "4. 探す文字: '{$searchChar}', ネガティブオフセット: {$offsetNegative}\n";
66    if ($lastPos4 !== false) {
67        echo "   ネガティブオフセット {$offsetNegative} で見つかった最後の '{$searchChar}' はインデックス {$lastPos4} に見つかりました。\n";
68    } else {
69        echo "   ネガティブオフセット {$offsetNegative} で '{$searchChar}' は見つかりませんでした。\n";
70    }
71    echo "----------------------------------------\n";
72
73    // 5. strrpos() は大文字小文字を区別する例
74    // 大文字の 'O' は元の文字列には含まれていないため、見つからない
75    $searchCaseSensitive = "O";
76    $lastPos5 = strrpos($haystack, $searchCaseSensitive);
77    echo "5. 探す文字 (大文字): '{$searchCaseSensitive}'\n";
78    if ($lastPos5 !== false) {
79        echo "   最後の '{$searchCaseSensitive}' はインデックス {$lastPos5} に見つかりました。\n";
80    } else {
81        echo "   '{$searchCaseSensitive}' は文字列内に見つかりませんでした。(strrpos は大文字小文字を区別します)\n";
82    }
83    echo "----------------------------------------\n";
84}
85
86// 関数の呼び出し
87$sampleText = "Hello world, how are you today, old friend?";
88demonstrateStrrposUsage($sampleText);
89
90?>

PHPのstrrpos()関数は、与えられた文字列($haystack)の中から、指定した部分文字列($needle)が最後に現れる位置を、0から始まるインデックス(数値)で返すための機能です。この関数は、検索において大文字と小文字を厳密に区別します。

検索を開始する位置を調整したい場合は、オプションの$offset引数を指定できます。$offsetが正の数値の場合、文字列の先頭からそのオフセット位置以降の範囲で、$needleが最後に見つかる位置を探します。一方、$offsetが負の数値の場合は、文字列の末尾から数えたそのオフセット位置より前の範囲で検索を行います。

もし検索対象の文字列内で$needleが見つからなかった場合、strrpos()falseを返します。この際、$needleが文字列の先頭(インデックス0)で見つかる場合と、全く見つからない場合(false)を正確に区別するためには、!== false=== falseのような厳密な比較演算子を使用することが重要です。この関数は、文字列の末尾に近い特定の部分を効率的に見つけ出す際に役立ちます。

strrpos関数は、文字列内で指定した部分文字列が「最後に現れる位置」を、左から数えて0から始まるインデックスとして返します。見つからなかった場合はブール値のfalseを返します。文字列の先頭で見つかった場合のインデックス0と、見つからなかった場合のfalseを区別するため、戻り値のチェックには=== falseのような厳密な比較を必ず使用してください。この関数は大文字と小文字を区別しますので、大文字小文字を区別せずに検索したい場合はstrripos関数をご利用ください。第3引数のオフセットは、検索を開始する位置を指定します。正のオフセットは文字列の先頭から、負のオフセットは文字列の末尾からの位置を示し、その位置から逆方向に検索します。

PHP strrpos関数で部分文字列の末尾位置を検索する

1<?php
2
3/**
4 * PHPのstrrpos関数の使用例を示すスクリプト。
5 *
6 * strrpos関数は、ある文字列($haystack)の中で、指定された部分文字列($needle)が
7 * 最後に現れる位置を検索します。
8 * 見つかった場合はその位置(0から始まるインデックス)を整数で返し、
9 * 見つからなかった場合はfalseを返します。
10 * オプションの$offset引数を使用すると、検索を開始する範囲を制御できます。
11 */
12function demonstrateStrrpos(): void
13{
14    $mainString = "Hello world, welcome to the world of PHP!";
15    echo "検索対象文字列: \"{$mainString}\"\n\n";
16
17    // ----------------------------------------------------
18    // 1. 部分文字列が最後に見つかる位置を検索する基本的な例
19    // ----------------------------------------------------
20    $needle1 = "world";
21    echo "--- 基本的な検索: '{$needle1}' ---\n";
22    $position1 = strrpos($mainString, $needle1);
23
24    // strrposはintまたはfalseを返すため、厳密な比較 (=== false) が推奨されます。
25    if ($position1 !== false) {
26        echo "「{$needle1}」が最後に見つかった位置: {$position1}\n"; // 26
27    } else {
28        echo "「{$needle1}」は見つかりませんでした。\n";
29    }
30    echo "\n";
31
32    // ----------------------------------------------------
33    // 2. 部分文字列が見つからない場合の例
34    // ----------------------------------------------------
35    $needle2 = "php_language";
36    echo "--- 見つからない場合の検索: '{$needle2}' ---\n";
37    $position2 = strrpos($mainString, $needle2);
38
39    if ($position2 !== false) {
40        echo "「{$needle2}」が最後に見つかった位置: {$position2}\n";
41    } else {
42        echo "「{$needle2}」は見つかりませんでした。\n"; // こちらが実行されます
43    }
44    echo "\n";
45
46    // ----------------------------------------------------
47    // 3. オフセット(検索範囲の制限)を指定する例
48    //    正のオフセット: 文字列の先頭から指定されたオフセットまでの範囲で検索します。
49    //    負のオフセット: 文字列の末尾から指定されたオフセット分戻った位置から末尾までの範囲で検索します。
50    // ----------------------------------------------------
51    $needle3 = "world";
52
53    // 正のオフセットの例: 15
54    // "Hello world, welco" の範囲で「world」を検索。
55    // この範囲では最初の"world"(位置6)が最後に見つかります。
56    $offsetPositive = 15;
57    echo "--- 正のオフセット {$offsetPositive} で検索: '{$needle3}' ---\n";
58    $positionOffsetPositive = strrpos($mainString, $needle3, $offsetPositive);
59    if ($positionOffsetPositive !== false) {
60        echo "見つかった位置: {$positionOffsetPositive}\n"; // 6
61    } else {
62        echo "「{$needle3}」はオフセット {$offsetPositive} までの範囲で見つかりませんでした。\n";
63    }
64    echo "\n";
65
66    // 負のオフセットの例: -10
67    // 文字列の末尾から10文字戻った位置から末尾までの範囲で「world」を検索。
68    // 結果は、元の文字列における「world」の開始位置を返します。
69    $offsetNegative = -10;
70    echo "--- 負のオフセット {$offsetNegative} で検索: '{$needle3}' ---\n";
71    $positionOffsetNegative = strrpos($mainString, $needle3, $offsetNegative);
72    if ($positionOffsetNegative !== false) {
73        echo "見つかった位置: {$positionOffsetNegative}\n"; // 26
74    } else {
75        echo "「{$needle3}」はオフセット {$offsetNegative} の範囲で見つかりませんでした。\n";
76    }
77    echo "\n";
78}
79
80// 関数の実行
81demonstrateStrrpos();

strrpos関数は、PHP 8で利用可能な文字列操作関数の一つで、ある文字列($haystack)の中から、指定された部分文字列($needle)が最後に出現する位置を検索するために使用されます。

この関数は、まず検索対象の文字列$haystack、次に検索したい部分文字列$needleを引数として受け取ります。オプションとして、検索を開始する位置を整数で指定する$offset引数もあります。$offsetが正の値の場合は文字列の先頭からその位置までの範囲で検索し、負の値の場合は文字列の末尾から指定された文字数だけ戻った位置から末尾までの範囲で検索します。

strrpos関数は、部分文字列が見つかった場合、その開始位置を0から始まる整数で返します。例えば、文字列の先頭で見つかった場合は0を返します。もし部分文字列が見つからなかった場合は、falseを返します。したがって、結果を判定する際には、0も有効な位置であるため、falseとの厳密な比較(=== false)を行うことが重要です。

サンプルコードでは、「Hello world, welcome to the world of PHP!」という文字列から「world」が最後に出現する位置を検索し、26という結果を得ています。また、存在しない部分文字列を検索した場合はfalseが返されることや、$offset引数を使って検索範囲を限定する方法も示されており、例えば$offset15に指定すると最初の「world」の位置である6が返される例などが含まれています。

strrpos関数は、対象文字列内で指定した部分文字列が最後に出現する位置を数値で返しますが、見つからない場合はfalseを返します。文字列の先頭で部分文字列が見つかる場合、戻り値は0となりますので、結果の判定には$position !== falseのような厳密な比較を用いることが重要です。そうしないと0が見つからなかったと誤判定される可能性があります。

また、$offset引数は検索を開始する位置を指定します。正の値を指定すると文字列の先頭から、負の値を指定すると文字列の末尾からの相対位置となります。strrpos関数は、この指定されたオフセット位置から文字列の先頭方向へ検索を進め、その範囲内で最後に見つかった部分文字列の位置を返します。これはstrpos関数とは検索方向が異なるため、オフセット指定時の挙動には特に注意が必要です。

関連コンテンツ