PHPのstrpos関数の使い方!文字列内の位置を数値で取得する

PHPのstrpos関数は、文字列の中に、指定した別の文字列が最初に現れる位置(インデックス)を数値で返すために使用されます。

この関数は、文字列のどの位置に特定の文字やフレーズが含まれているかを知りたい場合に非常に便利です。
たとえば、URLから特定のパラメータが始まる位置を特定したり、文字列が特定の文字で始まるかをチェックしたりする際に役立ちます。
ただし、戻り値がfalseまたは0になる可能性があるため、正確に扱うには注意が必要です。

この記事では、strpos関数の基本的な使い方、引数、戻り値、主要な使用例、そして使用する際の重要な注意点について解説します。

strpos関数の基本的な構文

strpos関数の基本的な構文は以下の通りです。

strpos(string $haystack, string $needle, int $offset = 0): int|false
  • $haystack: 必須。検索対象となる元の文字列です。
  • $needle: 必須。$haystack内で検索したい文字列です。
  • $offset: オプション。検索を開始する位置(インデックス)を指定します。デフォルトは0です。

戻り値

検索文字列($needle)が見つかった場合は、その出現位置のインデックスが整数で返されます。
検索文字列($needle)が見つからなかった場合は false が返されます。

重要な点

  • 文字列のインデックスは0から始まります。つまり、文字列の先頭で見つかった場合、戻り値は0になります。
  • strpos関数は大文字と小文字を区別します。大文字と小文字を区別せずに検索したい場合は stripos関数を使用してください。
  • falseが返される可能性があるため、戻り値を厳密にチェックする必要があります。

strpos関数を使ってみる

strpos関数を実際に使って、動作を確認してみます。

例1:基本的な使い方

文字列のインデックスを取得します。

<?php
$myString = "Hello, world!";
$position = strpos($myString, "world");

echo "「world」の最初の出現位置は: {$position}" . PHP_EOL;
// 出力: 「world」の最初の出現位置は: 7

$myString変数に文字列が入っていて、次の行でstrpos関数を使っています。
文字列の中から「world」が入っている位置を取得しています。
取得した位置が$position変数に格納されます。

出力すると、位置が取れていることが確認できました。
Hが0番目なので、wは7番目になります。

例2:先頭で見つかった場合

検索文字列が探したい文字列の先頭にある場合、戻り値は0になります。

<?php
$text = "PHP is a great language.";
$pos = strpos($text, "PHP");

// 0 は false と評価されるため、厳密比較 (===) が必須
if ($pos !== false) {
    echo "「PHP」が見つかりました。位置は {$pos} です。" . PHP_EOL;
}
// 出力: 「PHP」が見つかりました。位置は 0 です。

$text変数の文字列の中から「PHP」を探して、位置を取得しています。
検索文字列が文字列の先頭で見つかるので、「0」が返ってきます。

0」なので、if文などの条件に指定する場合には、厳密比較「!==」する必要があります。
出力すると、0番目の位置が取得できていることが確認できました。

例3:文字列が見つからない場合の挙動

検索対象の文字列が見つからなかった場合、strpos関数はfalseを返します。

<?php
$sentence = "Hello, world!";
$pos = strpos($sentence, "Ruby");

// 結果は false なので、このブロックが実行される
if ($pos === false) {
    echo "「Ruby」は見つかりませんでした。" . PHP_EOL;
}
// 出力: 「Ruby」は見つかりませんでした。

この例では、探している文字列「Ruby」が対象文字列の中にないです。
そのため、falseが返ってきます。

falseなのか0なのかを分けるために、falseとの厳密な比較(===)を行うことが、意図しないバグを防ぐために重要です。

例4:検索開始位置の活用

検索開始位置のオプションは、特定の文字の後に続く部分を検索したい場合などに使用します。

<?php
$url = "http://www.example.com/page.html";

// 最初の「/」の位置を取得
$firstSlashPos = strpos($url, '/'); // 5

// 最初の「/」の次(インデックス6)から、次の「/」を検索
$secondSlashPos = strpos($url, '/', $firstSlashPos + 1);

echo "2番目の「/」の位置は: {$secondSlashPos}" . PHP_EOL;
// 出力: 2番目の「/」の位置は: 6

URL文字列「http://〜`」を検索対象にしています。
最初に「
/」の位置を検索して、$firstSlashPos`変数に「5」が返ってきます。

次の検索処理で、検索位置を指定して次の「/」が出る位置を取得しています。
最初の検索位置+1($firstSlashPos + 1)で次の場所から検索できます。

出力すると、次のスラッシュが出る「6」が返ってくることが確認できました。

strpos関数とstr_contains関数・strrpos関数の違い

関数 目的 戻り値 主な違い
strpos 最初の出現位置の取得 int または false 位置(インデックス)を返す。0番目の位置とfalseの区別が必要。
str_contains 含まれるかどうかの判定 bool (true/false) PHP 8.0以降で利用可能。厳密比較が不要で、直感的。
strrpos 最後の出現位置の取得 int または false 文字列の最後から検索し、見つかった位置(インデックス)を返す。

strpos関数を使う際の注意点

strpos関数を使う際の注意点です。

falseとの厳密比較

これが最も重要な注意点です。
戻り値が「0」になる可能性があるため、if (strpos(...)) のような単純な真偽値チェックは避けて、必ず if (strpos(...) !== false) または if (strpos(...) === false) のように厳密に比較してください。

大文字小文字の区別

strpos関数は大文字と小文字を区別します。
大文字と小文字を区別しない検索が必要な場合は、stripos関数を使用してください。

マルチバイト文字

strpos関数はバイト単位で動作し、マルチバイト文字エンコーディング(UTF-8など)を正しく扱いません。
マルチバイト文字列を安全に検索したい場合は、mb_strpos関数を使用してください。

<?php
$multibyte_str = "こんにちは世界";
$pos_mb = mb_strpos($multibyte_str, "世界", 0, 'UTF-8');

echo "「世界」の出現位置は: {$pos_mb}" . PHP_EOL;
// 出力: 「世界」の出現位置は: 5 (5文字目から始まる)

まとめ

PHPのstrpos関数は、対象文字列の検索文字列の「最初の出現位置」を数値で取得するための関数でした。

その戻り値の特性(0またはfalse)を正しく理解し、厳密な比較を常に意識してコーディングすることが、バグのない堅牢なコードを書く上で不可欠です。
これらのポイントを踏まえ、strpos関数を効果的に活用し、PHPアプリケーションにおける文字列処理を効率的に行いましょう。

PHP

コメント