【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 mb_strrposでマルチバイト文字の位置を探す
1<?php 2 3/** 4 * 文字列内で、指定された部分文字列が最後に現れる位置を探します。 5 * マルチバイト文字を安全に扱う mb_strrpos を使用します。 6 * strrpos はバイト単位で処理するため、日本語のようなマルチバイト文字を含む文字列では 7 * 意図しない結果を返す可能性があるため、通常は mb_strrpos の使用が推奨されます。 8 * 9 * @param string $haystack 検索対象の文字列 10 * @param string $needle 検索する部分文字列 11 * @param int $offset 検索を開始する位置 (デフォルトは0)。負の値を指定すると、文字列の末尾から文字数で数えて検索を開始します。 12 * @return int|false 部分文字列が見つかった場合はその開始位置(0からのオフセット)、見つからない場合は false 13 */ 14function findLastPositionMultiByte(string $haystack, string $needle, int $offset = 0): int|false 15{ 16 // mb_strrpos はマルチバイト文字に対応しており、文字単位で位置を計算します。 17 return mb_strrpos($haystack, $needle, $offset); 18} 19 20// === 使用例 === 21 22// 1. 基本的な使用例:文字列の最後の「世界」の位置を検索 23$text1 = "こんにちは、世界。PHPの世界へようこそ。"; 24$search1 = "世界"; 25$position1 = findLastPositionMultiByte($text1, $search1); 26echo "1. '{$search1}' の最後の位置: " . ($position1 !== false ? $position1 : "見つかりません") . PHP_EOL; // 出力: 13 (2つ目の「世界」の開始位置) 27 28// 2. 存在しない部分文字列の検索 29$search2 = "Python"; 30$position2 = findLastPositionMultiByte($text1, $search2); 31echo "2. '{$search2}' の最後の位置: " . ($position2 !== false ? $position2 : "見つかりません") . PHP_EOL; // 出力: 見つかりません 32 33// 3. 正のオフセットを指定した検索:指定位置より後から検索を開始 34// 文字列 "世界こんにちは、世界" で、オフセット 6 (「こ」の次) から検索すると2つ目の「世界」が見つかる 35$text2 = "世界こんにちは、世界"; 36$search3 = "世界"; 37$offset3 = 6; 38$position3 = findLastPositionMultiByte($text2, $search3, $offset3); 39echo "3. '{$search3}' の最後の位置 (オフセット {$offset3} から): " . ($position3 !== false ? $position3 : "見つかりません") . PHP_EOL; // 出力: 9 (2つ目の「世界」の開始位置) 40 41// 4. 負のオフセットを指定した検索:文字列の末尾から数えて検索を開始 42// "abcdefgabc" の末尾から4文字目('f')から前方に検索。「abc」の最後の出現位置は7。 43$text4 = "abcdefgabc"; 44$search4 = "abc"; 45$offset4 = -4; 46$position4 = findLastPositionMultiByte($text4, $search4, $offset4); 47echo "4. '{$search4}' の最後の位置 (オフset {$offset4} から): " . ($position4 !== false ? $position4 : "見つかりません") . PHP_EOL; // 出力: 7 (末尾の「abc」) 48 49// 5. マルチバイト文字での負のオフセットの例 50// "あいうえおあいうえお" の末尾から3文字目(「う」)から前方に検索。2つ目の「あいう」の位置は5。 51$text5 = "あいうえおあいうえお"; 52$search5 = "あいう"; 53$offset5 = -3; 54$position5 = findLastPositionMultiByte($text5, $search5, $offset5); 55echo "5. '{$search5}' の最後の位置 (オフセット {$offset5} から): " . ($position5 !== false ? $position5 : "見つかりません") . PHP_EOL; // 出力: 5 (2つ目の「あいう」) 56 57?>
strrpos関数はバイト単位で文字列を検索するため、日本語などのマルチバイト文字では意図しない結果を招くことがあります。このため、サンプルコードではマルチバイト文字を安全に文字単位で検索できるmb_strrpos関数を利用したfindLastPositionMultiByte関数を使用しています。
findLastPositionMultiByte関数は、検索対象の文字列$haystackから部分文字列$needleの最後の出現位置を探します。$offsetは検索開始位置で、正の値は先頭から、負の値は末尾からの文字数です。部分文字列が見つかった場合はその開始位置を0からのオフセット(文字数)で返し、見つからなかった場合はfalseを返します。
サンプルコードでは、基本的な検索、見つからない場合、正負のオフセット指定、マルチバイト文字でのオフセットを使った検索といった多様な利用例を示し、関数の柔軟な使い方と結果の解釈を具体的に理解するのに役立ちます。
strrpos関数は文字列をバイト単位で処理するため、日本語のようなマルチバイト文字を含む文字列では意図しない検索結果となる可能性があります。そのため、サンプルコードで示されているように、マルチバイト文字に対応したmb_strrpos関数の使用を強く推奨いたします。
この関数は、検索対象が見つかった場合はその位置を整数(0から始まるオフセット)で返しますが、見つからなかった場合はfalseを返します。文字列の先頭で見つかった場合の0と、見つからなかった場合のfalseを区別するため、結果の判定には=== falseや!== falseといった厳密な比較演算子を必ず使用してください。引数のoffsetは、正の値を指定するとその位置以降から検索を開始し、負の値を指定すると文字列の末尾から数えてその位置より前方に向かって検索します。
PHP strposとstrrposで文字列位置を検索する
1<?php 2 3/** 4 * strpos() と strrpos() の使用例を示し、その違いを比較する関数です。 5 * 6 * strpos(): 文字列内で指定した部分文字列が最初に出現する位置を検索します。 7 * strrpos(): 文字列内で指定した部分文字列が最後に出現する位置を検索します。 8 * 9 * どちらの関数も、見つかった場合は0から始まる位置(インデックス)を整数で返します。 10 * 見つからなかった場合は boolean の false を返します。 11 * 厳密な比較 (=== または !==) を使用して false をチェックすることが重要です。 12 */ 13function demonstrateStringPositionFunctions(): void 14{ 15 $text = "PHPは汎用性の高いプログラミング言語です。PHPはWeb開発でよく利用されます。"; 16 $searchString = "PHP"; 17 $notFoundString = "Python"; 18 19 echo "元の文字列: \"" . $text . "\"\n"; 20 echo "検索する文字列: \"" . $searchString . "\"\n\n"; 21 22 // strpos() の使用例 23 // 最初に見つかる "PHP" の位置を検索 24 $firstPosition = strpos($text, $searchString); 25 26 if ($firstPosition !== false) { 27 echo "strpos(): \"" . $searchString . "\" は最初の出現位置 " . $firstPosition . " (0から数えます) に見つかりました。\n"; 28 echo " - 見つかった部分: \"" . substr($text, $firstPosition, strlen($searchString)) . "\"\n"; 29 } else { 30 echo "strpos(): \"" . $searchString . "\" は見つかりませんでした。\n"; 31 } 32 33 echo "\n"; 34 35 // strrpos() の使用例 36 // 最後に見つかる "PHP" の位置を検索 37 $lastPosition = strrpos($text, $searchString); 38 39 if ($lastPosition !== false) { 40 echo "strrpos(): \"" . $searchString . "\" は最後の出現位置 " . $lastPosition . " (0から数えます) に見つかりました。\n"; 41 echo " - 見つかった部分: \"" . substr($text, $lastPosition, strlen($searchString)) . "\"\n"; 42 } else { 43 echo "strrpos(): \"" . $searchString . "\" は見つかりませんでした。\n"; 44 } 45 46 echo "\n"; 47 48 // 見つからない場合の例 (strrpos() を使用) 49 echo "検索する文字列 (見つからない場合): \"" . $notFoundString . "\"\n"; 50 $notFoundPosition = strrpos($text, $notFoundString); 51 52 if ($notFoundPosition !== false) { 53 echo "strrpos(): \"" . $notFoundString . "\" は位置 " . $notFoundPosition . " に見つかりました。\n"; 54 } else { 55 echo "strrpos(): \"" . $notFoundString . "\" は見つかりませんでした。\n"; 56 } 57} 58 59// 関数を実行して、strpos() と strrpos() の動作を確認します。 60demonstrateStringPositionFunctions(); 61
PHPのstrrpos()関数は、与えられた文字列の中で、指定した部分文字列が「最後」に出現する位置を検索する機能を提供します。これに対してstrpos()関数は、「最初」に出現する位置を検索する点でstrrpos()とは異なります。
どちらの関数も、第一引数$haystackに検索対象の文字列、第二引数$needleに探したい部分文字列を指定します。検索に成功した場合、部分文字列が見つかった位置を0から始まる整数(インデックス)で返します。もし部分文字列が見つからなかった場合は、論理値falseを返します。
特に、検索結果が文字列の先頭(位置0)であった場合と、見つからなかった場合のfalseを区別するために、if ($変数 !== false)のように厳密な比較演算子(!==)を使用することが非常に重要です。
このサンプルコードは、strpos()とstrrpos()の具体的な使用例を通して、それぞれの関数が文字列のどこから検索を開始し、どのような結果を返すのかを比較しながら理解できるようになっています。文字列の検索位置によって処理を分けたい場合に活用できます。
strpos()とstrrpos()は、それぞれ文字列の「最初」と「最後」に、指定した部分文字列が出現する位置を検索する関数です。どちらも、検索する文字列が見つかった場合は、0から始まる数値(インデックス)を返します。最も重要な注意点は、検索する文字列が見つからなかった場合に、boolean型のfalseを返す点です。
このため、関数の戻り値を判定する際には、=== falseまたは!== falseのような厳密な比較を必ず使用してください。もし緩やかな比較(== falseなど)を使うと、文字列の先頭(インデックス0)で部分文字列が見つかった場合でも、「見つからなかった」と誤判定される可能性があるため、注意が必要です。これにより、コードの安全性と正確性が保たれます。
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引数を使って検索範囲を限定する方法も示されており、例えば$offsetを15に指定すると最初の「world」の位置である6が返される例などが含まれています。
strrpos関数は、対象文字列内で指定した部分文字列が最後に出現する位置を数値で返しますが、見つからない場合はfalseを返します。文字列の先頭で部分文字列が見つかる場合、戻り値は0となりますので、結果の判定には$position !== falseのような厳密な比較を用いることが重要です。そうしないと0が見つからなかったと誤判定される可能性があります。
また、$offset引数は検索を開始する位置を指定します。正の値を指定すると文字列の先頭から、負の値を指定すると文字列の末尾からの相対位置となります。strrpos関数は、この指定されたオフセット位置から文字列の先頭方向へ検索を進め、その範囲内で最後に見つかった部分文字列の位置を返します。これはstrpos関数とは検索方向が異なるため、オフセット指定時の挙動には特に注意が必要です。