・IT/Web系エンジニアの経験者の方
・どこの転職エージェントを利用しようか迷っている方
それなら、キッカケエージェントにご相談!
キッカケエージェントでは、少数精鋭のエージェントが、エンジニアの経験やスキル、志向性などをカウンセリングし、的確なアドバイスを提供します!
また、徹底した企業へのヒアリングにより、最適なマッチングを実現し、今では内定率が一般的なエージェントの2倍以上となっています!
転職エージェントに迷っている方、まずは無料でキャリア相談から!
(この記事は2022年7月05日に投稿されました。)
PHPで文字列の位置を検索する関数として、mb_strpos()があります。
mb_strpos()とは検索したいマルチバイト文字列の最初の位置を取得する関数になります。
マルチバイト文字列の最初の位置を取得することから、全角文字列の位置を取得することができたり、半角と全角が混ざった文字列の位置も正確に取得することができたりします。
そして、mb_strpos()は、必須と任意を合わせて最大4つパラメータを指定できるので、検索するための条件を自分でカスタマイズすることもできます。
そのため、PHPで最初に現れる文字列の位置を取得したい場合はmb_strpos()を使用しましょう。
今回はPHPのmb_strpos()で最初に現れるマルチバイト文字列の位置を取得する方法について紹介していきます。
・PHPで検索したいマルチバイト文字列の出現位置を知りたい人
mb_strpos()とは
mb_strpos()とは、最初に現れるマルチバイト文字列の位置を取得する関数となります。
そもそも、マルチバイトとは1バイト(主に半角英数字)では表現できない文字のことであり、全角文字などのように複数のバイトで成り立っている文字のことを指します。
そのため、ひらがなやカタカナ、漢字などもマルチバイトとなります。
指定したマルチバイト文字列の位置を返すことから、返り値は0を始めとするインデックスとなります。
mb_strpos()の書き方
mb_strpos()の書き方は下記のようになります。
1 | <?php mb_strpos('検索対象の文字列', '検索する文字列'[, '検索開始位置', 'エンコード']); ?> |
mb_strpos()の中にパラメータを必ず2つ指定する必要がありますが、最大4つまで指定することができます。
mb_strpos()のパラメータ
mb_strpos()で指定するパラメータは下記のようになります。
- 検索対象の文字列(必須)
検索を対象とする文字列を指定する - 検索する文字列(必須)
検索したい文字列を指定する - 検索開始位置(任意)
検索開始位置をインデックスで指定する(スタートが0) - エンコーディング(任意)
文字のエンコードを指定する
1つ目のパラメータは検索対象となる文字列を指定し、2つ目のパラメータは検索したい文字列を指定します。
そして、3つ目は、検索対象の文字列の検索開始位置を数値で指定し、4つ目は文字のエンコーディングをエンコード名で指定します。
mb_strpos()で最初に現れるマルチバイト文字列の位置を取得するサンプルコード
mb_strpos()で最初に現れるマルチバイト文字列の位置を取得するサンプルコードをご紹介します。
ここでは下記の3つの場合でmb_strpos()を使用してみます。
- 検索したマルチバイト文字列が見つかった場合
- 検索したマルチバイト文字列が見つからなかった場合
- 検索したマルチバイト文字列が大文字/小文字である場合
検索したマルチバイト文字列が見つかった場合
検索したマルチバイト文字列が見つかった場合にmb_strpos()を使用してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text1 = '似た者は自然に集まってくる、類は友を呼ぶ。'; echo '⚫︎ 対象の文字列'; echo $text1; $search1 = '自然'; echo '・検索したい文字'; echo $search1; $text1_idx = mb_strpos($text1, $search1); echo '・mb_strpos()使用後'; echo $text1_idx; ?> |
実行結果
「自然」の文字列が見つかったため、インデックスとして「4」が返されています。
検索したマルチバイト文字列が見つからなかった場合
検索したマルチバイト文字列が見つからなかった場合にmb_strpos()を使用してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text2 = '似た者は自然に集まってくる、類は友を呼ぶ。'; echo '⚫︎ 対象の文字列'; echo $text2; $search2 = '山田'; echo '・検索したい文字'; echo $search2; $text2_idx = mb_strpos($text2, $search2); echo '・mb_strpos()使用後'; echo $text2_inx; ?> |
実行結果
「山田」の文字列がなかったため、mb_strpos()では何も返されません。
そのため、結果としては空が表示されます。
検索したマルチバイト文字列が大文字/小文字である場合
検索したマルチバイト文字列が大文字/小文字である場合にmb_strpos()を使用してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text3 = '似た者は自然に集まってくる、類は友を呼ぶ。'; echo '⚫︎ 対象の文字列'; echo $text3; $search3 = 'つてくる'; echo '・検索したい文字'; echo $search3; $text3_idx = mb_strpos($text3, $search3); echo '・mb_strpos()使用後'; echo $text3_idx; ?> |
実行結果
同じ文字列だとしてもmb_strpos()では、大文字と小文字は区別されます。
そのため、「つてくる」と「ってくる」は違う文字だと認識され、空が返ってきます。
mb_strpos()で半角文字列の位置を検索した場合
半角文字列の位置を検索する場合にmb_strpos()を使用してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text4 = 'Birds of a feather flock together.'; echo '⚫︎ 対象の文字列'; echo $text4; $search4 = 'flock'; echo '・検索したい文字'; echo $search4; $text4_idx = mb_strpos($text4, $search4); echo '・mb_strpos()使用後'; echo $text4_idx; ?> |
実行結果
mb_strpos()はマルチバイト文字列だけでなく、半角文字列でも検索することができます。
そのため、「flock」のインデックスである「19」が表示されています。
検索開始位置を設定して最初に現れるマルチバイト文字列の位置を取得するサンプルコード
mb_strpos()の検索開始位置を設定して、特定の文字列を検索するサンプルコードをご紹介していきます。
ここでは下記の2つの場合でmb_strpos()を使用してみます。
- 正の整数を指定した場合
- 負の整数を指定した場合
正の整数を指定した場合
検索開始位置に正の整数を指定して、mb_strpos()でマルチバイト文字列を検索してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text5 = '似た者は自然に集まってくる、類は友を呼ぶ。'; echo '⚫︎ 対象の文字列'; echo $text5; $search5 = 'は'; echo '・検索したい文字'; echo $search5; $text5_idx = mb_strpos($text5, $search5, 5); echo '・mb_strpos()使用後'; echo $text5_idx; ?> |
実行結果
検索開始位置に正の数を指定すると、文頭から数えた位置をスタート地点として文字列を検索するようになります。
そのため、2つ目の「は」のインデックスである「15」が返されてます。
検索対象となるのは「然に集まってくる、類は友を呼ぶ。」となります。
負の整数を指定した場合
検索開始位置に負の整数を指定して、mb_strpos()でマルチバイト文字列を検索してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text6 = '似た者は自然に集まってくる、類は友を呼ぶ。'; echo '⚫︎ 対象の文字列'; echo $text6; $search6 = 'は'; echo '・検索したい文字'; echo $search6; $text6_idx = mb_strpos($text6, $search6, -9); echo '・mb_strpos()使用後'; echo $text6_idx; ?> |
実行結果
検索開始位置に負の数を指定すると、文頭をスタート地点として文字列の末尾から数えた位置までの文字列を検索するようになります。
そのため、こちらも2つ目の「は」のインデックスである「15」が返されてます。
検索の対象となるのは「る、類は友を呼ぶ。」となります。
エンコーデイングを指定して最初に現れるマルチバイト文字列の位置を取得するサンプルコード
エンコーデイングを指定してmb_strpos()で最初に現れるマルチバイト文字列の位置を取得するサンプルコードを紹介していきます。
ここでは下記の2つの場合でmb_strpos()を使用してみます。
- UTF-8を指定してた場合
- SJISを指定した場合
UTF-8を指定した場合
mb_strpos()にUTF-8を指定して、マルチバイト文字列の位置を検索してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $text7 = '対象の文字列を検索'; echo '⚫︎ 対象の文字列'; echo $text7; $search7 = '文字列'; echo '・検索したい文字'; echo $search7; $text7_idx = mb_strpos($text7, $search7, 0, 'UTF-8'); echo '・mb_strpos()使用後'; echo $text7_idx; |
実行結果
エンコーディングに「UTF-8」を指定すると、文字列がUTF-8に符号化されて最初の位置を取得するようになります。
そのため、「文字列」のインデックスである「3」が返されてます。
UTF-8を指定すると、1文字につき1カウントされるようになります。
SJISを指定した場合
mb_strpos()にSJISを指定して、マルチバイト文字列の位置を検索してみます。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text8 = '対象の文字列を検索'; echo '⚫︎ 対象の文字列'; echo $text8; $search8 = '文字列'; echo '・検索したい文字'; echo $search8; $text8_idx = mb_strpos($text8, $search8, 0, 'SJIS'); echo '・mb_strpos()使用後'; echo $text8_idx; ?> |
実行結果
エンコーディングに「SJIS「を指定すると、文字列がSJISに符号化されて最初の位置を取得するようになります。
そのため、SJISの「文字列」のインデックスである「6」が返されてます。
SJISを指定すると、1文字につき2カウントされるようになります。
mb_strpos()とstrpos()の違い
PHPでは、mb_strpos()とよく似た関数でstrpos()が存在します。
正直、関数の名前が似ており、処理の内容も似ています。
それでは、この2つの関数にはどのような違いがあるのでしょう?
結論から言うと、検索位置として返されるインデックスがずれるところに違いがあります。
例えば、全角と半角が混じった文字列に対してそれぞれの関数を使用したとします。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php $text9 = '私は、PHPを勉強します。'; echo '⚫︎ 対象の文字列'; echo $text9; $search9_1 = 'PHP'; echo '・検索する文字'; echo $search9_1; $text9_idx1 = strpos($text9, $search9_1); echo '・strpos()使用後'; echo $text9_idx1; $search9_2= 'PHP'; echo '・検索する文字'; echo $search9_2; $text9_idx2 = mb_strpos($text9, $search9_2); echo '・mb_strpos()使用後'; echo $text9_idx2; ?> |
実行結果
strpos()を使用した場合、全角は3つ、半角は1つとしてカウントするので、インデックスとして「9」が返されます。
しかし、mb_strpos()を使用した場合、全角も半角も1つとしてカウントするので、インデックスとして「3」が返されます。
このように、検索位置として返されるインデックスがずれるところに違いがあることから、文字列にマルチバイトが入っているかいないかで使い分けるようにしましょう。
もし、strpos()について詳しく知りたい場合は下記の記事をご参考ください。
半角文字列の場合はstrpos()、日本語などのマルチバイト文字列の場合はmb_strpos()を使用すれば良いかと思います。
最後に現れるマルチバイト文字列の位置を取得する場合
最後に現れるマルチバイト文字列の位置を取得する場合は、mb_strrpos()を使用します。
mb_strrpos()はマルチバイト文字列で検索した文字列の最後の位置を取得する関数となります。
そのため、今回紹介しているmb_strpos()とは対になる関数となります。
⚫︎ index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $text10 = '似た者は自然に集まってくる、類は友を呼ぶ。'; echo '⚫︎ 対象の文字列'; echo $text10; $search10 = 'は'; echo '・検索したい文字'; echo $search10; $text10_idx = mb_strrpos($text10, $search10); echo '・mb_strrpos()使用後'; echo $text10_idx; ?> |
実行結果
mb_strrpos()によって最後に現れるマルチバイト文字列の位置を取得しています。
そのため、2つ目の「は」のインデックスである「15」が表示されています。
まとめ
⚫︎ mb_strpos()とは検索したいマルチバイト文字列の最初の位置を取得する関数である
⚫︎ mb_strpos()のパラメータは2つ必須だが、最大4つまで指定できる
・ 検索対象の文字列(必須)
・ 検索する文字列(必須)
・ 検索開始位置(任意)
・ エンコーディング(任意)
⚫︎ mb_strpos()で検索した文字列が見つかった場合は、見つかった位置をインデックス(0がスタート)で返す
⚫︎ mb_strpos()で検索した文字列が見つからなかった場合は、値としては何も返されない
⚫︎ mb_strpos()で検索する文字列を大文字や小文字にした場合は、値としては何も返されない
(大文字と小文字は区別される)
⚫︎ mb_strpos()は半角文字列の位置も正確に取得することができる
⚫︎ 検索開始位置に正の整数を指定して文字列を検索した場合、文字列の頭から数えた位置をスタート地点として文字列を検索する
⚫︎ 検索開始位置に負の整数を指定して文字列を検索した場合、文頭をスタート地点とし、文末のから数えた位置までの文字列を検索する
⚫︎ エンコードにutf-8を指定してマルチバイト文字列を検索した場合
⚫︎ エンコードにSJISを指定してマルチバイト文字列を検索した場合
⚫︎ mb_strpos()とstrpos()は全角文字を含む文字列を検索した場合に返されるインデックスがずれるところに違いがある
⚫︎ 検索したマルチバイト文字列で最後に現れる位置を取得する場合はmb_strrpos()を使用する