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

作成日: 更新日:

mb_stristr関数は、文字列の中から特定の文字列を大文字・小文字を区別せずに検索し、見つかった部分文字列を返す関数です。この関数は、特に日本語のようなマルチバイト文字を含む文字列を安全かつ正確に扱うために設計されており、従来のstristr関数では文字化けや意図しない結果になる可能性がある場合でも、正しく処理できる点が特徴です。

主な使い方としては、検索対象の文字列(haystack)と検索したい文字列(needle)を指定します。mb_stristrは、haystackの中からneedleを見つけると、needleが見つかった位置からhaystackの最後までを部分文字列として返します。例えば、「あいうえお」という文字列の中から「う」を探すと、「うえお」が返されます。

また、オプションで第3引数before_needletrueに設定すると、needleが見つかった位置までの文字列(needle自体は含まない)を返すことも可能です。上記の例でbefore_needletrueにすると、「あい」が返されます。

さらに、第4引数encodingを指定することで、検索対象の文字列の文字エンコーディングを明示的に指定できます。これにより、異なるエンコーディングの文字列が混在する環境でも、エンコーディングに起因する問題を避け、安定した検索結果を得られます。

検索文字列が見つからない場合はfalseを返します。Webアプリケーションでユーザーが入力したマルチバイト文字を含む検索クエリを処理する際や、様々なエンコーディングのテキストデータを解析する際に非常に有用な関数です。

基本的な使い方

構文(syntax)

<?php
$haystack = "The quick brown Fox jumps over the lazy dog.";
$needle = "fox"; // 大文字小文字を区別しない検索

$result = mb_stristr($haystack, $needle);
// $result には "Fox jumps over the lazy dog." が代入される
?>

引数(parameters)

string $haystack, string $needle, bool $before_needle = false, ?string $encoding = null

  • string $haystack: 検索対象となる文字列
  • string $needle: 検索する文字列
  • bool $before_needle = false: trueの場合、$needle が見つかる前の部分文字列を返します。デフォルトは false です。
  • ?string $encoding = null: 文字エンコーディングを指定します。指定しない場合は内部エンコーディングが使用されます。

戻り値(return)

string|false

指定された部分文字列を、大文字・小文字を区別せずに検索し、見つかった部分文字列から文字列の最後までを返します。見つからなかった場合は false を返します。

サンプルコード

PHP mb_stristrで部分文字列を検索する

<?php

/**
 * mb_stristr関数の基本的な使い方を示すサンプルコードです。
 * この関数は、大文字・小文字を区別せずにマルチバイト文字列の検索を行い、
 * 見つかった位置から始まる部分文字列、または見つかった位置までの部分文字列を返します。
 * 標準のstristr関数のマルチバイト版として使用されます。
 */

// 検索対象となる元の文字列(マルチバイト文字を含む)
$haystack = "こんにちは、PHPの世界へようこそ! PHPは素晴らしい言語です。";

echo "元の文字列: " . $haystack . "\n\n";

// --- 例1: 検索文字列が見つかった位置から文字列の最後までを取得する場合 ---
// 第3引数 $before_needle はデフォルトで false
// 大文字・小文字を区別しないため、「php」で検索しても「PHP」にマッチします。
$needle1 = "php";
$result1 = mb_stristr($haystack, $needle1);

if ($result1 !== false) {
    echo "例1: '{$needle1}' 以降の部分文字列 (大文字小文字を区別しない):\n";
    echo "結果: " . $result1 . "\n\n";
} else {
    echo "例1: '{$needle1}' は見つかりませんでした。\n\n";
}

// --- 例2: 検索文字列が見つかった位置までの文字列を取得する場合 ---
// 第3引数 $before_needle を true に設定します。
$needle2 = "世界";
$result2 = mb_stristr($haystack, $needle2, true);

if ($result2 !== false) {
    echo "例2: '{$needle2}' までの部分文字列 (大文字小文字を区別しない):\n";
    echo "結果: " . $result2 . "\n\n";
} else {
    echo "例2: '{$needle2}' は見つかりませんでした。\n\n";
}

// --- 例3: 検索文字列が見つからなかった場合 ---
// 関数は false を返します。
$needle3 = "Python";
$result3 = mb_stristr($haystack, $needle3);

if ($result3 !== false) {
    echo "例3: '{$needle3}' 以降の部分文字列:\n";
    echo "結果: " . $result3 . "\n";
} else {
    echo "例3: '{$needle3}' は見つかりませんでした。\n";
}

PHPのmb_stristr関数は、日本語のようなマルチバイト文字を含む文字列から、指定した文字列を大文字・小文字を区別せずに検索し、その部分を抽出するために使用されます。標準のstristr関数がシングルバイト文字列を扱うのに対し、この関数はマルチバイト文字列に安全に対応しています。

この関数は、検索対象の全体文字列を$haystack、検索したい特定の文字列を$needleとして受け取ります。第3引数$before_needleは、検索結果の挙動を制御します。この引数がfalse(デフォルト)の場合、$needleが見つかった位置から$haystackの最後までを返します。一方、trueに設定すると、$needleが見つかった位置までの部分文字列を返します。

検索が成功した場合、mb_stristr関数は条件に応じた部分文字列(string型)を返します。もし$needle$haystackの中に見つからなかった場合は、falseを返します。

サンプルコードの例1では、「php」という検索文字列に対し、元の文字列中の「PHP」に大文字・小文字を区別せずマッチし、その位置以降の部分文字列が返されています。これは$before_needleがデフォルトのfalseであるためです。例2では、$before_needletrueに設定することで、「世界」という文字列が見つかるまでの部分文字列が取得されています。そして、例3では「Python」が見つからないため、関数はfalseを返し、検索失敗として処理されています。このように、mb_stristr関数は、文字列の一部を柔軟かつ安全に抽出できるため、実際のシステム開発でよく利用されます。

mb_stristr関数は、マルチバイト文字を含む文字列の大文字小文字を区別しない検索を行う際に使用します。これは標準のstristr関数のマルチバイト対応版です。

検索文字列が見つからなかった場合、関数はfalseを返します。そのため、戻り値は必ず!== falseで厳密にチェックし、その結果に基づいて適切な処理を行うようにしてください。

第3引数$before_needleの挙動を理解することが重要です。この引数をtrueに設定すると、検索文字列が見つかるまでの部分文字列を返します。デフォルト値のfalseでは、検索文字列が見つかった位置から文字列の最後までを返します。

マルチバイト文字を正確に処理するためには、PHPの内部エンコーディング設定(通常はmb_internal_encoding関数で設定)が適切であることを確認するか、関数の第4引数$encodingで明示的にエンコーディングを指定することをお勧めします。エンコーディングが誤っていると、意図しない結果や文字化けが発生する可能性があります。

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