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

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

作成日: 更新日:

基本的な使い方

strripos関数は、ある文字列の中から、指定した部分文字列が大文字と小文字を区別せずに最後に出現する位置を見つけるための関数です。この関数は、与えられた文字列($haystack)の中で、探したい部分文字列($needle)がどこにあるかを検索します。

検索の方向は指定しませんが、結果として返されるのは見つかった部分文字列の最後の出現位置です。この位置は、文字列の先頭から数えた番号(オフセット)として整数で返されます。文字列の最初の文字の位置は0番目です。もし部分文字列が見つからない場合は、論理値のfalseを返します。

例えば、「Applepie」という文字列の中から「p」を検索した場合、strripos関数は最後の「p」の位置である6を返します(0から数えるため)。「PHP」と「php」を同じものとして扱いますので、大文字小文字の違いを気にせず検索したい場合に非常に便利です。

オプションの引数$offsetを指定すると、検索を開始する位置を調整できます。正の値を指定すれば文字列の先頭からその位置以降を、負の値を指定すれば文字列の末尾からその位置分戻った位置から検索が始まります。

strripos関数は、返り値が0(文字列の先頭で見つかった場合)とfalse(見つからなかった場合)の両方があり得るため、結果を評価する際には厳密な比較演算子(===)を使用することが強く推奨されます。これにより、意図しないバグを防ぐことができます。PHP 8においても、この関数の基本的な動作と機能は変わりません。

構文(syntax)

1<?php
2$haystack_string_value = "This is a test string for testing PHP strripos function with test.";
3$needle_string_value = "test";
4$offset_integer_value = 0;
5
6$result_int_or_false = strripos(
7    haystack: $haystack_string_value,
8    needle: $needle_string_value,
9    offset: $offset_integer_value
10);
11?>

引数(parameters)

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

  • string $haystack: 検索対象となる文字列
  • string $needle: 検索する文字列
  • int $offset = 0: 検索を開始する位置(省略可能、デフォルトは文字列の先頭)

戻り値(return)

int|false

指定された文字列が、別の文字列内で最初に見つかった位置(インデックス)を返します。見つからなかった場合は false を返します。

サンプルコード

PHP mb_strriposで最後に見つかる位置を検索する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 文字列の中から、大文字小文字を区別せずに、
7 * 指定した部分文字列が最後に出現する位置を検索します。
8 *
9 * mb_strripos()は日本語などのマルチバイト文字に対応しており、
10 * 文字単位で位置を返します。
11 *
12 * @param string $haystack 検索対象の文字列
13 * @param string $needle   検索する部分文字列
14 *
15 * @return void
16 */
17function findLastPosition(string $haystack, string $needle): void
18{
19    echo "検索対象の文字列: \"{$haystack}\"" . PHP_EOL;
20    echo "検索する部分文字列: \"{$needle}\"" . PHP_EOL;
21    echo "----------------------------------------" . PHP_EOL;
22
23    // 文字列のエンコーディングを 'UTF-8' と指定して検索を実行
24    // 第3引数(offset)は検索開始位置で、0は文字列の先頭を意味する
25    $position = mb_strripos($haystack, $needle, 0, 'UTF-8');
26
27    // mb_strriposは、見つからない場合に false を返す
28    // そのため、厳密な比較 (=== または !==) を使用する必要がある
29    if ($position !== false) {
30        // PHPでは位置は0から始まるため、見つかった位置をそのまま出力
31        echo "結果: 「{$needle}」は、先頭から {$position} 文字目の位置に最後に見つかりました。" . PHP_EOL;
32    } else {
33        echo "結果: 「{$needle}」は見つかりませんでした。" . PHP_EOL;
34    }
35}
36
37// サンプル1: 日本語を含む文字列から検索
38// 「こんにちは、PHPの世界。PHPは楽しい。」
39$haystack1 = 'こんにちは、PHPの世界。PHPは楽しい。';
40$needle1 = 'php'; // 大文字・小文字は区別されない
41findLastPosition($haystack1, $needle1);
42
43echo PHP_EOL;
44
45// サンプル2: 見つからない場合の例
46$haystack2 = 'この文字列にはターゲットはありません。';
47$needle2 = 'PHP';
48findLastPosition($haystack2, $needle2);
49

PHPのmb_strripos関数は、与えられた文字列($haystack)の中から、指定された部分文字列($needle)が最後に出現する位置を、大文字小文字を区別せずに検索するために使用されます。関数名のmb_は「マルチバイト」を意味し、日本語のようなマルチバイト文字を含む文字列でも正確に文字単位で位置を扱うことができる点が特徴です。

引数には、検索対象となる文字列($haystack)と、検索したい部分文字列($needle)を渡します。オプションとして、検索を開始する位置($offset)と、文字列のエンコーディング(例: 'UTF-8')も指定できます。サンプルコードでは、エンコーディングとして'UTF-8'を指定しています。

この関数は、部分文字列が見つかった場合、その文字列の先頭から数えた0始まりの位置を整数で返します。しかし、部分文字列が見つからなかった場合はブール値のfalseを返します。そのため、検索結果を評価する際には、if ($position !== false)のように厳密な比較演算子(!==または===)を使用して、0番目の位置で見つかった場合と、全く見つからなかった場合を正確に区別する必要があります。サンプルコードでは、この関数を用いて日本語の文章中の「PHP」の最終出現位置を検索する例が示されています。

このサンプルコードは、日本語などのマルチバイト文字を正確に処理するmb_strripos関数を使用している点に注意が必要です。通常のstrripos関数はマルチバイト文字に非対応なため、日本語などを扱う場合はmb_strriposを使い、文字化けや意図しない結果を避けるようにしてください。mb_strriposは検索結果が見つからない場合にfalseを返します。そのため、結果の判定では、文字列の先頭(0文字目)で見つかった場合と区別するため、if ($position !== false)のように厳密な比較を必ず行ってください。第4引数でエンコーディングを明示的に指定することで、処理の安定性が向上し、予期せぬ文字処理の問題を防ぐことに繋がります。

PHP strripos 関数で最後の文字列位置を探す

1<?php
2
3/**
4 * PHPのstrripos関数の使用例。
5 * この関数は、大文字小文字を区別せずに、文字列内で指定した部分文字列が最後に現れる位置を探します。
6 * 検索はオフセット地点から文字列の先頭方向へ向かって行われます。
7 */
8
9// 検索対象となる文字列
10$haystack = "Hello World! The world is beautiful, isn't it?";
11// 検索する部分文字列 (大文字小文字を区別しないため 'world' と 'World' は同じと見なされる)
12$needleExisting = "world";
13// 検索する部分文字列 (存在しない場合)
14$needleNonExisting = "universe";
15
16echo "検索対象文字列: \"{$haystack}\"\n\n";
17
18// 1. 基本的な使用例: 最後に現れる 'world' (大文字小文字を区別しない) の位置を検索
19// 'world' はインデックス 6 ('World') とインデックス 17 ('world') に出現します。
20// strriposは最後に現れるインデックス 17 を返します。
21$position1 = strripos($haystack, $needleExisting);
22
23if ($position1 !== false) {
24    echo "1. 最後の '{$needleExisting}' はインデックス {$position1} で見つかりました。\n";
25} else {
26    echo "1. '{$needleExisting}' は見つかりませんでした。\n";
27}
28
29// 2. 存在しない部分文字列を検索する例
30$position2 = strripos($haystack, $needleNonExisting);
31
32if ($position2 !== false) {
33    echo "2. '{$needleNonExisting}' はインデックス {$position2} で見つかりました。\n";
34} else {
35    echo "2. '{$needleNonExisting}' は見つかりませんでした。\n";
36}
37
38// 3. オフセットを指定して検索を開始する例 (正のオフセット)
39// インデックス 10 から後方 (文字列の先頭方向) に 'world' を検索します。
40// 検索範囲は実質的に $haystack の先頭からインデックス 10 までとなります。
41// "Hello World! The world is beautiful, isn't it?"
42//             ^ (インデックス 10)
43// この範囲では、'World' (インデックス 6) が最後に見つかります。
44$offsetPositive = 10;
45$position3 = strripos($haystack, $needleExisting, $offsetPositive);
46
47if ($position3 !== false) {
48    echo "3. インデックス {$offsetPositive} から後方 ('{$needleExisting}') を検索し、インデックス {$position3} で見つかりました。\n";
49} else {
50    echo "3. インデックス {$offsetPositive} から後方 ('{$needleExisting}') は見つかりませんでした。\n";
51}
52
53// 4. オフセットを指定して検索を開始する例 (負のオフセット)
54// 文字列の末尾から -15 文字の位置 (後ろから15文字目) から後方へ検索します。
55// "Hello World! The world is beautiful, isn't it?"
56//                               ^ (末尾から15文字手前)
57// この位置から後方へ検索すると、'world' (インデックス 17) が見つかります。
58$offsetNegative = -15;
59$position4 = strripos($haystack, $needleExisting, $offsetNegative);
60
61if ($position4 !== false) {
62    echo "4. 末尾から {$offsetNegative} 文字の位置から後方 ('{$needleExisting}') を検索し、インデックス {$position4} で見つかりました。\n";
63} else {
64    echo "4. 末尾から {$offsetNegative} 文字の位置から後方 ('{$needleExisting}') は見つかりませんでした。\n";
65}

strripos関数は、PHPにおいて、指定した文字列($haystack)の中から、検索したい部分文字列($needle)が大文字小文字を区別せずに最後に現れる位置を探す際に利用されます。この関数は、文字列の最初から見て、部分文字列が最も右側(末尾に近い方)に現れる位置のインデックスを返します。

オプションの第三引数$offsetを指定すると、検索を開始する位置を調整できます。$offsetが正の数値の場合、そのインデックス位置から文字列の先頭方向(左方向)へ向かって検索が行われます。この検索範囲内で最後に見つかる部分文字列のインデックスが戻り値となります。負の数値の場合、文字列の末尾から数えた位置から同様に先頭方向へ検索が進められます。

部分文字列が見つかった場合、その開始位置を0から始まるインデックス(整数値)として返します。もし見つからなかった場合は、falseが戻り値となります。部分文字列が文字列の冒頭(インデックス0)で見つかることもあるため、戻り値がfalseかどうかを厳密に比較するためには、!== falseまたは=== falseのような厳密な比較演算子を使用することが推奨されます。これにより、意図しない挙動を防ぎ、正確なプログラムロジックを構築することができます。

strripos関数は、大文字小文字を区別せずに、文字列内で指定した部分文字列が最後に現れる位置を検索します。特に、検索は指定されたオフセット地点から文字列の先頭方向に向かって行われる点に注意が必要です。部分文字列が見つからない場合はfalseを返すため、見つかった位置が0である場合と区別するために、!== falseを用いた厳密な比較を行うことが重要です。オフセットは正の値の場合、そのインデックスから前方へ検索し、負の値の場合、文字列の末尾から数えた位置から前方へ検索します。マルチバイト文字(日本語など)の正確な位置を必要とする場合は、mb_strripos関数を利用することを検討してください。

関連コンテンツ