文字列を扱う際に、特定のキーワードが含まれているか否かを確認したいケースがあるかと思います。
PHPでは、文字列の検索に使用できる関数がいくつか用意されています。
今回はその中の1つである、「strpos」 関数について解説していきたいと思います。
PHPのstrpos関数とは?
strpos関数は、文字列の検索に使用する関数です。
検索対象となる文字列の中から、指定した文字列が最初に現れる位置を検索することができます。
この関数を使用することにより、特定の文字列が含まれるか否かの判定や、文字の切り出しを行う前の位置特定などが可能となります。
似たような機能を持つ関数は他にもいくつかありますが、その中でも実行速度が特に速いことが特徴の1つです。
strpos関数の使い方
さっそく、strpos関数の使い方について見ていきましょう。
基本構文
まず初めに、strpos関数の基本構文から解説していきます。
strpos関数を使用する際は、以下の構文で記述します。
【基本構文】
strpos(検索対象の文字列, 検索する文字列[, 検索を開始する位置])
第1引数に検索対象となる文字列を指定し、第2引数に検索したい文字列を指定します。
PHP 7.3以前の場合、文字列以外の型が検索文字列として渡されると、対応する数値に変換されて文字列コードとして扱われます。
PHP 8.0以降の場合は文字列型のみを受け付け、他の型が渡されると警告が発生します。
第3引数には、検索を開始する位置を指定することができます。
負の数を指定した場合、末尾からその数分だけ戻った位置から検索を開始します。
戻り値は整数値、もしくは false です。
検索する文字列が見つかった場合は、先頭からの相対位置を整数値で返します。
見つからなかった場合は false を返します。
以下のサンプルコードで、実際の動きを見てみましょう。
【サンプルコード】
<?php
//検索対象の文字列
$targetStr = 'This is sampleCode';
//検索する文字列
$searchStr = 'sample';
//指定した文字列を検索
$pos = strpos($targetStr, $searchStr);
if ($pos !== false){
echo $searchStr.'の位置は'.$pos.'番目です。'."\n";
} else {
echo $searchStr.'は存在しません。'."\n";
}
?>
【実行結果】
sampleの位置は8番目です。
検索する 「sample」 の文字列が存在するため、整数値が戻り値として返されています。
切り出しなどを行う場合は、この値を元に処理することができます。
文字列の検索位置を指定する
先ほども解説したように、strpos関数の第3引数には、文字列の検索を開始する位置を指定することができます。
以下の例を見てみましょう。
【サンプルコード】
<?php
$targetStr = 'Hello, world! This world is PHP';
$searchStr = 'world';
//検索開始位置を指定
$pos = strpos($targetStr, $searchStr, 10);
echo $searchStr.'の位置は'.$pos.'番目です。'."\n";
?>
【実行結果】
worldの位置は19番目です。
上記のサンプルコードで検索している 「world」 の文字は2箇所ありますが、開始位置を1つ目の world の文頭よりも後ろに指定しているため、2つ目の world の位置が結果として返却されています。
このように、開始位置の指定によって検索結果が変わる場合があります。
strpos関数の注意点
strpos関数を使用する際には一点、注意するべきポイントがあります。
既に解説したように、strpos関数の戻り値は整数値か false のいずれかです。
これらの結果は、if文の条件式としても使用することができますが、条件の指定方法によっては意図しない動作が起こってしまう場合があります。
まずは、以下の例を見てみましょう。
【サンプルコード】
<?php
$targetStr = 'Hello, world!';
$searchStr = 'Hello';
$pos = strpos($targetStr, $searchStr);
if ($pos) {
echo $searchStr.'の位置は'.$pos.'番目です。'."\n";
} else {
echo $searchStr.'は存在しません';
}
?>
【実行結果】
Helloは存在しません
結果を見ると、検索した 「Hello」 の文字列が存在しているにも関わらず、false の場合を想定した処理が実行されているのが分かりますね。
上記のサンプルコードのように、値の比較結果による真偽値ではなく、数値そのものを条件式の結果として返した場合に、0は false として評価されます。
そのため、上記のサンプルコードのように条件を指定してしまうと、検索した文字列の位置が文頭 (0番目 ) に存在した場合に、処理が正常に行われなくなってしまいます。
strpos関数を if文の条件式に使用する場合は、戻り値が false と一致するか否かで処理を分けるようにしましょう。
また、比較の際は、厳密な比較 (=== や !==) を行う必要があります。
【サンプルコード】
<?php
$targetStr = 'Hello, world!';
$searchStr = 'Hello';
$pos = strpos($targetStr, $searchStr);
if ($pos !== false) {
echo $searchStr.'の位置は'.$pos.'番目です。'."\n";
} else {
echo $searchStr.'は存在しません';
}
?>
【実行結果】
Helloの位置は0番目です。
緩やかな比較を行うと、上述したケースの不具合が起こってしまうため、注意するようにしてください。
mb_strposでマルチバイト文字列を検索する
strpos関数を使用する際のもう1つの注意点として、検索する文字列にマルチバイト文字が含まれると、正確な位置を取得することができないという問題があります。
マルチバイト文字とは、1つの文字を表現するのに2バイト以上のデータを必要とする文字のことを言います。
strpos関数は1バイトを1文字として換算するため、マルチバイト文字が含まれる文字列を対象にすると、取得した結果と実際の位置にズレが生じてしまいます。
ひらがなや漢字など、日本語で使用する文字全般はマルチバイト文字に当たるため、これらの文字列が含まれる場合は別の関数を使用して検索する必要があります。
その際に活用できるのが、mb_strpos関数です。
mb_strposの使い方
mb_strpos関数を使用する際の基本構文は、以下の通りです。
【基本構文】
mb_strpos(検索対象の文字列, 検索する文字列[, 検索を開始する位置[, 文字コード]])
第3引数までと、戻り値の内容はstrpos関数と同様ですが、mb_strpos関数の場合は第4引数で文字コードを指定することができます。
引数を省略した場合は、内部文字エンコーディングが適用されます。
以下のサンプルコードで、strpos関数と mb_strpos関数の動きの違いを見てみましょう。
【サンプルコード】
<?php
$targetStr = 'これはサンプルコードです';
$searchStr = 'サンプル';
$pos = strpos($targetStr, $searchStr);
$mbPos = mb_strpos($targetStr, $searchStr);
echo 'strpos:'.$searchStr.'の位置は'.$pos.'番目です。'."\n";
echo 'mb_strpos:'.$searchStr.'の位置は'.$mbPos.'番目です。'."\n";
?>
【実行結果】
strpos:サンプルの位置は9番目です。
mb_strpos:サンプルの位置は3番目です。
結果を見ると分かる通り、それぞれの関数でマルチバイト文字の処理方法が異なっています。
上記の例の場合、各文字を表現するのに3バイトを必要としているため、strpos関数の方の結果では検索した文字の位置までにある文字数に3を掛けた数値が返されています。
ですが当然、実際の文字列の位置とは異なるため正しい結果であるとは言えません。一方で、 mb_strpos関数は実際の位置と同じ数値が結果として返されています。
このように取得結果に明確な違いが現れるため、検索対象の文字列に合わせて関数を使い分けるようにしましょう。
配列の中の文字列をstrposで検索するには?
配列の中の文字列を対象に検索したい場合、配列を直接扱う関数は用意されていないため、要素を取り出して確認する必要があります。
【サンプルコード】
<?php
$sampleArray = [
'sample.test',
'sample.array',
'array.test'
];
foreach($sampleArray as $value){
$pos = strpos($value, 'test');
if ($pos === false) {
echo $value.':testは含まれていません。'."\n";
} else {
echo $value.':testの位置は'.$pos.'番目です。'."\n";
}
}
?>
【実行結果】
sample.test:testの位置は7番目です。
sample.array:testは含まれていません。
array.test:testの位置は6番目です。
複数箇所で同じ処理を使用する場合は、関数を自作するという方法もあります。
str_contains関数で文字列を検索する
PHP8以降に新たに追加された関数で、文字列の検索に活用することができる 「str_contains」 という関数があります。
ここまで紹介してきた strpos関数とどのように違うのか、使用方法なども踏まえて解説していきたいと思います。
str_contains関数とは
str_contains関数は、strpos関数と同じく、検索対象とする文字列の中に特定の文字列が含まれているかを検索することができる関数です。
両者の最も大きな違いは、文字列が含まれている場合の戻り値が異なることです。
strpos関数の場合は、文字列が最初に現れた位置を整数値で返しますが、str_contains関数の場合は true を返します。
そのため、関数を if文の条件式に使用した際に、厳密な比較を行う必要がなくなるといったメリットがあります。
一方で、文字列の位置を str_contains関数で確認することはできないため、用途に応じて使い分けするといいでしょう。
str_contains関数の使い方
str_contains関数を使用する際の基本構文は、以下の通りです。
【基本構文】
str_contains(検索対象の文字列, 検索する文字列)
サンプルコードで、実際の動きを見てみましょう。
【サンプルコード】
<?php
$targetStr = 'Hello, world!';
$searchStr = 'Hello';
$result = str_contains($targetStr, $searchStr);
if($result) {
echo $searchStr.'は存在します。'."\n";
} else {
echo $searchStr.'は存在しません。'."\n";
}
?>
【実行結果】
Helloは存在します。
上記のサンプルコードは、strpos関数の場合は正常に作動しないコードとなっています。
最初に文字列が現れる位置が0番目であるため、strpos関数で取得した結果を条件式に使用すると、false の判定となるためです。
一方で、str_contains関数の場合は数値でなく true を返すため、このように値の厳密な比較を行わずとも、条件式に使用することができます。
まとめ
いかがでしたか?
今回は、冒頭で解説した strpos関数と合わせて、文字列の検索に使える関数をいくつか紹介しました。
PHPで文字列を比較する際は、含まれる文字の種類や戻り値の違いによって、関数の使い分けをする必要があります。
それぞれの機能をよく確認し、適切に使用していきましょう。
PHPの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、PHPに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。