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

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

作成日: 更新日:

基本的な使い方

strpos関数は、ある文字列の中に特定の文字列が最初に現れる位置を見つける関数です。この関数は、主に二つの引数を受け取ります。一つ目は検索対象となる大きな文字列(haystack)、二つ目は探し出す小さな文字列(needle)です。さらに、検索を開始する位置を数値で指定するオプションの引数(offset)も利用できます。このoffsetが正の値であればその位置から右へ、負の値であれば文字列の末尾から数えてその位置から右へ検索を開始します。

もし探している文字列が見つかった場合、strpos関数は、その文字列が最初に現れる位置を0から始まる数値として返します。例えば、文字列の先頭で見つかれば0を返します。しかし、もし文字列が見つからなかった場合は、ブール値のfalseを返します。この戻り値の特性から、文字列が見つからなかった場合のfalseと、文字列が先頭で見つかった場合の0を区別するために、厳密な比較演算子(===)を使用してfalseかどうかを判断することが非常に重要です。また、strpos関数は大文字と小文字を区別して検索を行います。大文字と小文字を区別せずに検索したい場合は、stripos関数を使用してください。この関数は、テキスト処理において特定のパターンを検出する際に広く利用されます。

構文(syntax)

1strpos(string $haystack, string $needle, int $offset = 0): int|false

引数(parameters)

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

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

戻り値(return)

int|false

strpos関数は、指定された文字列の中で、最初に見つかった部分文字列のオフセット(位置)を整数で返します。部分文字列が見つからなかった場合はfalseを返します。

サンプルコード

PHP strpos で複数箇所を検索する

1<?php
2
3/**
4 * 指定された文字列 (needle) が、別の文字列 (haystack) 内に複数回出現する位置をすべて見つけます。
5 * strpos関数をループで繰り返し使用することで、すべての出現箇所を特定します。
6 *
7 * @param string $haystack 検索対象の文字列。
8 * @param string $needle 検索する文字列。
9 * @return array<int> 見つかったすべての出現位置の配列。見つからない場合や、$needleが空文字列の場合は空の配列を返します。
10 */
11function findAllStringPositions(string $haystack, string $needle): array
12{
13    $positions = []; // 見つかった出現位置を格納する配列
14    $offset = 0;     // strposの検索開始オフセット
15
16    // 検索する文字列 (needle) が空の場合、無限ループになるため早期に空配列を返す
17    if ($needle === '') {
18        return [];
19    }
20
21    // strpos が false (見つからなかった場合) を返すまでループを続ける
22    // strpos の結果が 0 (文字列の先頭で見つかった場合) も考慮し、厳密な比較 (=== false) を使用
23    while (($pos = strpos($haystack, $needle, $offset)) !== false) {
24        $positions[] = $pos; // 見つかった位置を配列に追加
25
26        // 次の検索は、現在の位置の直後から開始する
27        // $needle の長さを加算することで、同じ部分文字列を繰り返し検出するのを避ける
28        $offset = $pos + strlen($needle);
29    }
30
31    return $positions;
32}
33
34// --- 使用例 ---
35
36// 例1: ターゲット文字列が複数回出現するケース
37$text1 = "PHPは素晴らしいプログラミング言語です。PHPを使ってWeb開発を学びましょう。PHPは学習しやすいです。";
38$searchWord1 = "PHP";
39
40echo "--- 検索例1 ---" . PHP_EOL;
41echo "検索対象の文字列: 「{$text1}」" . PHP_EOL;
42echo "検索する文字列: 「{$searchWord1}」" . PHP_EOL;
43
44$phpPositions = findAllStringPositions($text1, $searchWord1);
45
46if (empty($phpPositions)) {
47    echo "「{$searchWord1}」は見つかりませんでした。" . PHP_EOL;
48} else {
49    echo "「{$searchWord1}」の出現位置:" . PHP_EOL;
50    foreach ($phpPositions as $index => $position) {
51        echo ($index + 1) . "回目: 位置 " . $position . PHP_EOL;
52    }
53    echo "合計 " . count($phpPositions) . " 回出現しました。" . PHP_EOL;
54}
55
56echo PHP_EOL; // 空行
57
58// 例2: ターゲット文字列が1回のみ出現するケース
59$text2 = "Hello World!";
60$searchWord2 = "World";
61
62echo "--- 検索例2 ---" . PHP_EOL;
63echo "検索対象の文字列: 「{$text2}」" . PHP_EOL;
64echo "検索する文字列: 「{$searchWord2}」" . PHP_EOL;
65
66$worldPositions = findAllStringPositions($text2, $searchWord2);
67
68if (empty($worldPositions)) {
69    echo "「{$searchWord2}」は見つかりませんでした。" . PHP_EOL;
70} else {
71    echo "「{$searchWord2}」の出現位置:" . PHP_EOL;
72    foreach ($worldPositions as $index => $position) {
73        echo ($index + 1) . "回目: 位置 " . $position . PHP_EOL;
74    }
75    echo "合計 " . count($worldPositions) . " 回出現しました。" . PHP_EOL;
76}
77
78echo PHP_EOL; // 空行
79
80// 例3: ターゲット文字列が見つからないケース
81$text3 = "OpenAI Codex";
82$searchWord3 = "GPT";
83
84echo "--- 検索例3 ---" . PHP_EOL;
85echo "検索対象の文字列: 「{$text3}」" . PHP_EOL;
86echo "検索する文字列: 「{$searchWord3}」" . PHP_EOL;
87
88$gptPositions = findAllStringPositions($text3, $searchWord3);
89
90if (empty($gptPositions)) {
91    echo "「{$searchWord3}」は見つかりませんでした。" . PHP_EOL;
92} else {
93    echo "「{$searchWord3}」の出現位置:" . PHP_EOL;
94    foreach ($gptPositions as $index => $position) {
95        echo ($index + 1) . "回目: 位置 " . $position . PHP_EOL;
96    }
97    echo "合計 " . count($gptPositions) . " 回出現しました。" . PHP_EOL;
98}
99
100?>

PHPのstrpos関数は、ある文字列($haystack)の中に、特定の文字列($needle)が最初に出現する位置を探すためのものです。この関数は、見つかった場合はその開始位置を数値(オフセット)で返し、見つからなかった場合はブール値のfalseを返します。文字列の先頭で見つかった場合、戻り値は0となるため、結果を確認する際には=== falseのように厳密な比較を行うことが大切です。

提供されたサンプルコードでは、このstrpos関数を応用して、指定された文字列が検索対象内に複数回出現するすべての位置を見つけるfindAllStringPositions関数が定義されています。この関数は、strposwhileループ内で繰り返し呼び出すことで機能します。一度文字列が見つかると、その位置を結果の配列に追加し、次の検索を開始する位置($offset引数)を、直前に見つかった位置の直後($pos + strlen($needle))に更新します。これにより、同じ部分文字列を何度も検出することなく、連続して次の出現箇所を探し続けることができます。また、検索する文字列が空の場合に無限ループとなるのを避けるため、早期に処理を終了する工夫も含まれています。このコードは、strposの基本的な使い方に加え、その特性と$offset引数を活用した実用的な応用例として、文字列操作の理解に役立ちます。

このサンプルコードは、PHPのstrpos関数をループで使い、指定した文字列のすべての出現位置を効率的に見つける方法を示しています。特に重要な注意点は、strpos関数が見つからない場合にfalseを返し、文字列の先頭で見つかった場合に0を返す点です。この0falseを混同しないよう、ループの条件では!== falseという「厳密な比較演算子」を必ず使用してください。また、検索する文字列($needle)が空文字列の場合に無限ループに陥る危険があるため、事前に空文字列チェックを行い、早期に処理を終えることが安全なコードを書く上で不可欠です。次の検索開始位置を$pos + strlen($needle)と設定することで、同じ部分文字列を重複して検出することを避け、正しいすべての出現位置を特定できます。

関連コンテンツ

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