定義と使い方
- PHPバージョン
- 5.2+
mb_stripos()関数は
文字列内から特定の文字列の位置を検索する関数です。
この関数はstripos()関数とほぼ同等の機能を持っていますが、日本語、韓国語、中国語などのマルチバイト(multi-byte)文字列に対して安全に動作する点が大きな違いです。
英語や数字などは1 byteですが、日本語、韓国語、中国語などは2 byte以上になります。2 byte以上のバイトで表現されるものを「multi-byte(マルチバイト)」と呼びます。
特徴
- multi-byte(マルチバイト)をサポートしています。
- 対象文字列内で指定した文字列が最初に出現する位置(インデックス)を返します。
- 指定した文字列が含まれていない場合はfalseを返します。
- 大文字と小文字を区別しません。
基本例
$haystack = 'こんにちは、PHP mb_stripos()関数の例です。';
$needle = 'php';
$position = mb_stripos($haystack, $needle, 0, 'UTF-8');
if ($position !== false) {
echo "部分文字列が見つかった位置: $position";
} else {
echo '部分文字列が見つかりませんでした。';
}
// 出力: 部分文字列が見つかった位置: 6
/*
* 注意してください!
* 文字列のインデックスは0から始まります。
* 最初の文字のインデックスは0で、2番目の文字のインデックスは1です。
*/
日本語におけるstripos()関数の問題点
stripos()関数は、日本語のようなマルチバイト(multi-byte)文字列をサポートしていないため、意図しない結果が発生します。
$haystack = 'こんにちは、PHP mb_stripos()関数の例です。';
$needle = 'php';
$position = stripos($haystack, $needle, 0, 'UTF-8');
if ($position !== false) {
echo "部分文字列が見つかった位置: $position";
} else {
echo '部分文字列が見つかりませんでした。';
}
// 出力: 部分文字列が見つかった位置: 17 ← 意図しない結果が発生します。
UTF-8のようなマルチバイト文字エンコーディングでは、1文字が複数のバイトで表現されるため、stripos()関数のように、通常のバイト数をそのまま基準として文字列を処理すると、予期しない結果を招く可能性があります。
mb_stripos()関数によるstripos()関数の日本語問題の解決
mb_stripos()関数は、日本語のようなマルチバイト(multi-byte)文字列に対して安全に動作する機能を提供するため、stripos()関数における日本語の問題を解決できます。
覚えておきましょう!mb_stripos()関数は、stripos()関数の代わりに、マルチバイト(multi-byte)文字列に対して安全に動作する関数です。
構文
mb_stripos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false
引数
$haystack |
検索対象となる文字列です。 |
|---|---|
$needle |
検索する文字列です。
|
$offset |
オプションです。検索を開始する0基準のインデックスです。
|
$encoding |
オプションです。文字列のエンコーディングを指定します。 デフォルト値は nullで、省略するかnullを渡した場合は、内部文字エンコーディングの値が使用されます。
|
戻り値
対象文字列内で指定した文字列($needle)が最初に出現する位置(インデックス)を返します。
文字列の位置は1ではなく0から始まる点に注意してください。
指定した文字列($needle)が含まれていない場合は、falseを返します。
変更履歴
| バージョン | 説明 |
|---|---|
| 8.0.0 | $needleには空文字列('')を指定できます。 |
| 8.0.0 | $encodingは、現在ではnullの値を指定できるようになりました。 |
| 7.1.0 | $offsetに負の値を渡せるようになりました。 |
注意点
mb_stripos()関数は大文字と小文字を区別しません。
大文字と小文字を区別して使用したい場合は、mb_strpos()関数を使用してください。
文字列のインデックスは0から始まります。
最初の文字のインデックスは0で、2番目の文字のインデックスは1です。
$newstring = 'あいうえお かきくけこ';
$pos = mb_stripos($newstring, 'あ', 0, 'UTF-8');
var_dump($pos); // int(0)
この関数の戻り値をBoolean型として使用する場合は注意が必要です。
戻り値を判定する際は、===演算子を使用してください。
mb_stripos()関数は、対象文字列内で指定した文字列が最初に出現する位置(インデックス)を戻り値として返します。文字列の位置は1ではなく0から始まる点に注意してください。
対象文字列内で指定した文字列が先頭に位置していると仮定します。
この場合、戻り値は0になります。
0は==演算子で比較するとfalseとして評価されます。
実際には指定した文字列が存在しているにもかかわらずfalseが返ってしまうため、戻り値をブール(boolean)型として判定する場合は、厳密な型比較を行う必要があり、===演算子を使用しなければなりません。
Boolean型として戻り値を使用する場合は、===演算子を使用してください。
$newstring = 'あいうえお かきくけこ';
$pos = mb_stripos($newstring, 'あ', 0, 'UTF-8');
var_dump($pos); // int(0)
if ($pos === false) {
echo "文字列内に'あ'は見つかりません。";
} else {
echo "文字列内に'あ'が含まれています。";
}
// 出力: "文字列内に'あ'が含まれています。"
PHP 8より前のバージョンでは、検索する文字列に空文字列('')は許可されていません。
'')は許可されていません。
$newstring = 'あいうえお かきくけこ';
$substring = '';
$pos = mb_stripos($newstring, $substring, 0, 'UTF-8'); // Warning: mb_stripos(): Empty delimiter