文字列

PHPで文字列に特定の部分文字列が含まれるか確認する方法を解説

PHPでは、文字列の中に特定のサブ文字列が存在するかを確認する方法がいくつかあります。

この記事では、基本的な関数を使ってシンプルにチェックする手法を、初心者にも分かりやすく紹介します。

PHPの文字列検索の基本関数

strpos関数による検索方法

基本的な使い方

strpos関数は、文字列内に指定した部分文字列が存在するかを調べるために使用します。

下記のサンプルコードは、変数$haystack内に$needleがあるかを確認する例です。

<?php
// 検索対象の文字列
$haystack = "こんにちは、PHPの世界へようこそ!";
// 検索する部分文字列
$needle = "PHP";
// strpos関数により部分文字列の位置を取得
$position = strpos($haystack, $needle);
// 位置が見つかった場合は位置を表示し、見つからなかった場合は-1を返す仕組みの例
if ($position !== false) {
    echo "部分文字列「{$needle}」は、文字列内の位置 {$position} に存在します。";
} else {
    echo "部分文字列「{$needle}」は見つかりません。";
}
?>
部分文字列「PHP」は、文字列内の位置 6 に存在します。

戻り値の解釈と注意点

strpos関数の戻り値は、見つかった場合に部分文字列の開始位置(0から始まる数値)を返します。

部分文字列が先頭にある場合は0が返されるため、評価時にfalseと区別する必要があります。

例えば、下記のコードは部分文字列が先頭にある場合の注意点を示しています。

<?php
// 部分文字列が先頭にある例
$haystack = "PHPを学ぶ";
$needle = "PHP";
// 検索結果が0の場合に誤ってfalseと判断しないための工夫
$position = strpos($haystack, $needle);
if ($position === false) {
    echo "部分文字列「{$needle}」は見つかりません。";
} else {
    echo "部分文字列「{$needle}」は、文字列内の位置 {$position} に存在します。";
}
?>
部分文字列「PHP」は、文字列内の位置 0 に存在します。

str_contains関数の利用

PHP 8以降の特徴

PHP 8以降では、str_contains関数が導入され、部分文字列が存在する場合にtrue、存在しない場合にfalseのブール値を返します。

シンプルな真偽値判定が可能なため、コードの可読性が向上します。

この関数は、部分文字列の存在チェックを直感的に記述できる点が特徴です。

シンプルな使用例

以下のコード例は、str_contains関数を用いて基本的な文字列検索を行う方法を示しています。

<?php
// 検索対象の文字列と検索する部分文字列の定義
$haystack = "PHPで文字列検索を試してみる";
$needle = "文字列検索";
// str_contains関数による判定
if (str_contains($haystack, $needle)) {
    echo "部分文字列「{$needle}」が文字列内に存在します。";
} else {
    echo "部分文字列「{$needle}」は存在しません。";
}
?>
部分文字列「文字列検索」が文字列内に存在します。

正規表現を用いた検索手法

preg_match関数の基本

正規表現を用いた検索には、preg_match関数が使用されます。

下記のコード例では、正規表現パターンにより文字列内に特定のパターンが存在するかをチェックしています。

正規表現を使用することで、柔軟な検索やパターンマッチングが可能となります。

<?php
// 検索対象の文字列と正規表現パターンの定義
$text = "今日は2023年10月にPHPの講座が開催されます。";
$pattern = "/\d{4}年\d{1,2}月/";
// preg_match関数を使って正規表現にマッチする部分を検索
if (preg_match($pattern, $text, $matches)) {
    echo "マッチした部分文字列: " . $matches[0];
} else {
    echo "正規表現にマッチする部分は見つかりませんでした。";
}
?>
マッチした部分文字列: 2023年10月

パターン指定時のポイント

正規表現パターンを指定する際は、以下の点に注意してください。

  • パターンの区切り文字:例ではスラッシュ/を使用していますが、別の文字も使用可能です。
  • エスケープ文字:特殊文字をそのまま扱いたい場合は、バックスラッシュ\を使用してエスケープします。
  • 数量指定子やキャプチャグループの利用:必要に応じて、\d+[a-zA-Z]などのパターンを駆使することで、柔軟な検索が可能です。

例えば、以下はメールアドレス形式をチェックする正規表現の例です。

<?php
// メールアドレス形式の正規表現パターン
$emailPattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
$email = "example@test.com";
// preg_match関数によりメールアドレス形式を検証
if (preg_match($emailPattern, $email)) {
    echo "有効なメールアドレス形式です。";
} else {
    echo "無効なメールアドレス形式です。";
}
?>
有効なメールアドレス形式です。

実用的なコード例と実装上の応用

複数文字列の同時検索

条件分岐との組み合わせ例

複数の部分文字列が存在するかを確認する場合、strpos関数やstr_contains関数と条件分岐を組み合わせることで対応できます。

以下は、複数のキーワードの存在をチェックするサンプルコードです。

<?php
// 検索対象の文字列
$haystack = "PHPの文字列検索と正規表現を学ぶサンプルコードです。";
// 複数の部分文字列リスト
$keywords = ["PHP", "正規表現", "JavaScript"];
// 各キーワードの存在をチェックするループ
foreach ($keywords as $keyword) {
    if (str_contains($haystack, $keyword)) {
        echo "キーワード「{$keyword}」は存在します。\n";
    } else {
        echo "キーワード「{$keyword}」は存在しません。\n";
    }
}
?>
キーワード「PHP」は存在します。
キーワード「正規表現」は存在します。
キーワード「JavaScript」は存在しません。

エッジケースの検証方法

検索時には、特殊な文字列や空の文字列が入力された場合のエッジケースにも対応する必要があります。

下記の例は、空文字やnullが含まれる場合の検証方法です。

<?php
// 検索対象の文字列
$haystack = "エッジケースの検討は実装品質に影響します。";
// エッジケースとして空文字とnullの場合
$edgeCases = ["", null, "実装"];
// 各ケースに対して存在確認を実施
foreach ($edgeCases as $case) {
    // 入力がnullまたは空文字の場合はスキップ
    if ($case === null || $case === "") {
        echo "空またはnullのキーワードは無視されます。\n";
        continue;
    }
    if (str_contains($haystack, $case)) {
        echo "キーワード「{$case}」は存在します。\n";
    } else {
        echo "キーワード「{$case}」は存在しません。\n";
    }
}
?>
空またはnullのキーワードは無視されます。
空またはnullのキーワードは無視されます。
キーワード「実装」は存在します。

エラー対策と検証ポイント

falseと0の区別

strpos関数は、部分文字列が先頭にある場合に0を返すため、厳密比較が必要です。

下記のコード例は、false0を正しく区別する方法を示しています。

<?php
// 先頭に部分文字列がある場合の例
$haystack = "Start with keyword";
$needle = "Start";
// strpos関数による検索結果
$result = strpos($haystack, $needle);
if ($result === false) {
    echo "部分文字列「{$needle}」は見つかりません。";
} else {
    // $resultが0の場合でも正しくヒットとして扱う
    echo "部分文字列「{$needle}」は、位置 {$result} に存在します。";
}
?>
部分文字列「Start」は、位置 0 に存在します。

予期しない動作の防止策

文字列検索の際は、以下の点に注意することで予期しない動作を防止できます。

  • データ型の確認:検索対象の文字列や部分文字列が期待通りの型か確認する
  • 大文字・小文字の区別:必要に応じて、大文字と小文字を揃えた上で比較する
  • マルチバイト文字対応:日本語などのマルチバイト文字を扱う場合、関数の挙動に注意する

例えば、大文字小文字を無視して検索する場合は、stripos関数を活用するのが有用です。

<?php
// 検索対象の文字列
$haystack = "Case Sensitiveな検索を回避する方法";
// 大文字小文字を無視して検索する部分文字列
$needle = "case sensitive";
// stripos関数により大文字小文字を無視した検索を実施
$position = stripos($haystack, $needle);
if ($position !== false) {
    echo "部分文字列「{$needle}」は、位置 {$position} に存在します。";
} else {
    echo "部分文字列「{$needle}」は存在しません。";
}
?>
部分文字列「case sensitive」は、位置 0 に存在します。

PHPバージョン別の対応

PHP 7以前との違い

PHP 7以前の環境では、部分文字列の存在チェックにstrpos関数がよく使用されていました。

この場合、戻り値が0となると誤ってfalseと判断される可能性があるため、厳密比較を行う必要がありました。

また、PHP 7以前にはstr_contains関数が存在しなかったため、コードの可読性に工夫が求められていました。

PHP 8以降の新機能と対応策

PHP 8以降では、str_contains関数が導入されたことで真偽値の判定がシンプルになりました。

また、その他の新機能により、以下のメリットがあります。

  • コードの可読性向上
  • エラー発生率の低減
  • 正規表現や文字列操作関数の性能改善

下記は、PHP 8以降での新機能を活用したサンプルコードです。

<?php
// PHP 8以降の新機能:str_contains関数を使用したサンプルコード
$text = "PHP 8の新機能を体験してみる";
$searchTerm = "新機能";
if (str_contains($text, $searchTerm)) {
    echo "部分文字列「{$searchTerm}」は見つかりました。";
} else {
    echo "部分文字列「{$searchTerm}」は見つかりません。";
}
?>
部分文字列「新機能」は見つかりました。

まとめ

この記事では、PHPの文字列検索における基本関数の使い方や戻り値の注意点、正規表現の利用法、複数文字列検索の実装例を具体的なコード例とともに解説した内容でした。

全体として、各関数の特徴やPHPバージョン別の対応策が整理され、実装時の選択肢が明確になりました。

ぜひ、実践の現場で今回の知識を活用して、コードの最適化やエラー対策に挑戦してみてください。

関連記事

Back to top button
目次へ