【PHP8.x】stripos()関数の使い方
stripos関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
stripos関数は、文字列の中から、指定された部分文字列が最初に現れる位置を、大文字と小文字を区別せずに見つけ出す関数です。この関数は、特定の文字やフレーズがテキスト内のどこにあるかを知りたい場合に特に役立ちます。
この関数を使用する際は、まず検索対象となる元の文字列(haystack)を指定します。次に、その文字列内で探したい部分文字列(needle)を引数として渡します。さらに、オプションとして検索を開始する位置(offset)を指定することも可能です。このoffsetを指定することで、文字列の途中から検索を開始し、特定の範囲内でのみ部分文字列を探すことができます。
検索が成功した場合、stripos関数は部分文字列が最初に現れる位置を整数値で返します。この位置は文字列の先頭を0として数えられ、例えば文字列の先頭で見つかった場合は0が返されます。もし部分文字列が見つからなかった場合は、ブール値のfalseを返します。したがって、この関数の戻り値を利用して条件分岐を行う際には、0とfalseを明確に区別するために、厳密な比較演算子(===)を使用することが重要です。
PHPには類似の機能を持つstrpos関数も存在しますが、strposが大文字と小文字を厳密に区別して検索するのに対し、striposは大文字と小文字を区別しないという点が最大の相違点です。この特性により、ユーザーが入力したキーワードが大文字・小文字のどちらで記述されていても柔軟にマッチさせたいような、ウェブサイトのコンテンツ検索や入力検証などの場面で非常に重宝されます。
構文(syntax)
1<?php 2$text = "Hello, PHP World!"; 3$search_string = "php"; // 大文字小文字を区別しない検索 4 5$position = stripos($text, $search_string); 6 7// 検索文字列が見つかった場合はその位置 (0から始まるインデックス)、見つからない場合は false を返します。 8if ($position !== false) { 9 echo "検索文字列が見つかった位置: " . $position; 10} else { 11 echo "検索文字列は見つかりませんでした。"; 12} 13?>
引数(parameters)
string $haystack, string $needle, int $offset = 0
- string $haystack: 検索対象の文字列
- string $needle: 検索する文字列
- int $offset = 0: 検索を開始する位置(デフォルトは0)
戻り値(return)
int|false
文字列内で、大文字・小文字を区別せずに検索した最初の出現位置のインデックスを返します。見つからなかった場合は false を返します。
サンプルコード
PHP striposで大文字小文字を区別せずに配列要素を検索する
1<?php 2 3/** 4 * 指定されたキーワードが配列のいずれかの要素に大文字小文字を区別せず含まれているかを検索します。 5 * キーワードが見つかった場合、その要素のキーと値のペアを含む連想配列を返します。 6 * 見つからなかった場合は空の配列を返します。 7 * 8 * @param array<string> $haystackArray 検索対象の文字列の配列。各要素は文字列であると仮定します。 9 * @param string $needle 検索するキーワード。 10 * @return array<int|string, string> キーワードが含まれる要素のキーと値のペアの連想配列。 11 */ 12function searchKeywordInArrayElements(array $haystackArray, string $needle): array 13{ 14 $foundElements = []; 15 16 // 配列の各要素をループ処理します。 17 // $key には配列のインデックス(数値または文字列)、$value には要素の値が入ります。 18 foreach ($haystackArray as $key => $value) { 19 // stripos を使用して、大文字小文字を区別せずにキーワードを検索します。 20 // stripos は、キーワードが見つかった場合、その開始位置(0を含む整数)を返します。 21 // キーワードが見つからない場合は false を返します。 22 // === または !== を使用して、0 と false の厳密な区別を行うことが重要です。 23 if (stripos($value, $needle) !== false) { 24 // キーワードが見つかった場合、その要素のキーと値を結果配列に追加します。 25 $foundElements[$key] = $value; 26 } 27 } 28 29 return $foundElements; 30} 31 32// --- サンプルコードの実行例 --- 33 34// 検索対象となる文字列の配列を準備します。 35$products = [ 36 'Apple iPhone 13', 37 'Samsung Galaxy S22', 38 'Google Pixel 6 Pro', 39 'MacBook Air M1', 40 'Dell XPS 15', 41 'iPad Pro', 42 'microsoft surface', 43]; 44 45echo "--- 検索対象の配列 ---\n"; 46print_r($products); 47echo "\n"; 48 49// 例1: キーワード 'apple' で検索 50$keyword1 = 'apple'; 51echo "--- 検索キーワード: '{$keyword1}' ---\n"; 52$results1 = searchKeywordInArrayElements($products, $keyword1); 53 54if (!empty($results1)) { 55 echo "キーワード '{$keyword1}' を含む要素が見つかりました:\n"; 56 foreach ($results1 as $key => $value) { 57 echo " キー: {$key}, 値: '{$value}'\n"; 58 } 59} else { 60 echo "キーワード '{$keyword1}' を含む要素は見つかりませんでした。\n"; 61} 62echo "\n"; 63 64// 例2: キーワード 'pro' で検索 65$keyword2 = 'pro'; 66echo "--- 検索キーワード: '{$keyword2}' ---\n"; 67$results2 = searchKeywordInArrayElements($products, $keyword2); 68 69if (!empty($results2)) { 70 echo "キーワード '{$keyword2}' を含む要素が見つかりました:\n"; 71 foreach ($results2 as $key => $value) { 72 echo " キー: {$key}, 値: '{$value}'\n"; 73 } 74} else { 75 echo "キーワード '{$keyword2}' を含む要素は見つかりませんでした。\n"; 76} 77echo "\n"; 78 79// 例3: キーワード 'windows' で検索(見つからないケース) 80$keyword3 = 'windows'; 81echo "--- 検索キーワード: '{$keyword3}' ---\n"; 82$results3 = searchKeywordInArrayElements($products, $keyword3); 83 84if (!empty($results3)) { 85 echo "キーワード '{$keyword3}' を含む要素が見つかりました:\n"; 86 foreach ($results3 as $key => $value) { 87 echo " キー: {$key}, 値: '{$value}'\n"; 88 } 89} else { 90 echo "キーワード '{$keyword3}' を含む要素は見つかりませんでした。\n"; 91} 92echo "\n";
このサンプルコードは、文字列の配列から特定のキーワードを大文字と小文字を区別せずに検索し、該当する要素を抽出する方法を示しています。
メインとなるsearchKeywordInArrayElements関数は、検索対象となる文字列の配列($haystackArray)と、検索したいキーワード($needle)の二つの引数を受け取ります。この関数は、キーワードが含まれる要素が見つかった場合、その要素のキーと値のペアを格納した連想配列を返します。もし一つも見つからなければ、空の配列が戻り値となります。
この検索機能を実現するために、PHPの組み込み関数であるstriposが使用されています。striposは、指定された文字列(第一引数)の中に、検索する文字列(第二引数)がどこから始まるかを大文字小文字を無視して調べます。キーワードが見つかった場合、その開始位置を数値(0から始まるインデックス)で返します。もし見つからなかった場合は、falseを返します。そのため、0という有効な位置とfalseを厳密に区別するため、サンプルコードでは!== false(厳密にfalseではない)という比較演算子を使っています。
関数内では、foreachループを使って配列の各要素を順に処理し、それぞれの要素に対してstriposでキーワードの有無をチェックしています。キーワードが見つかると、その要素のキーと値が結果として返される配列に追加されていきます。
続く実行例では、$productsという商品名リストの配列を用意し、「apple」や「pro」、「windows」といったキーワードで実際に検索を実行しています。これにより、関数がどのように機能し、どのような検索結果が得られるのかを具体的に確認することができます。このコードを通じて、配列内の特定の文字列を効率的に見つけ出す基本的なプログラミングパターンを学ぶことができます。
stripos関数は、大文字小文字を区別せずに文字列内の特定のキーワードを検索します。この関数の最も重要な注意点は、その戻り値の扱いです。キーワードが見つからなかった場合はfalseを返しますが、文字列の先頭(インデックス0)で見つかった場合は整数値の0を返します。
このため、検索結果の有無を判定する際には、if (stripos($value, $needle) !== false)のように、0とfalseを厳密に区別する!==演算子を使用することが不可欠です。!=や==のような非厳密な比較演算子を使ってしまうと、0とfalseが等価とみなされ、キーワードが文字列の先頭で見つかった場合に「見つからなかった」と誤判定される可能性がありますので、厳重に注意してください。サンプルコードは、配列の各要素が文字列であることを前提としています。もし要素が文字列以外の場合、型に関するエラーが発生する可能性がありますので、入力データの型を常に確認するようにしてください。
PHP stripos: 大文字小文字を区別しない文字列検索
1<?php 2 3/** 4 * stripos関数は、大文字・小文字を区別せずに文字列を検索します。 5 * このサンプルは、その「大文字・小文字を区別しない (case-insensitive)」特性を示します。 6 */ 7function demonstrateStripos(): void 8{ 9 $haystack = "Hello PHP World! Let's learn php programming."; 10 11 echo "検索対象文字列: \"{$haystack}\"\n\n"; 12 13 // 様々な検索文字列の例 14 $needles = [ 15 "php", // 小文字 16 "PHP", // 大文字 17 "World", // 先頭が大文字 18 "world", // 全て小文字 19 "Programming", // 先頭が大文字 20 "programming", // 全て小文字 21 "Java" // 存在しない文字列 22 ]; 23 24 foreach ($needles as $needle) { 25 // stripos() は大文字・小文字を区別せずに検索します (case-insensitive)。 26 // 例えば "php" と "PHP" は同じ位置で見つかります。 27 $position = stripos($haystack, $needle); 28 29 echo "検索文字列: \"{$needle}\" -> "; 30 31 // 検索結果が 0 (文字列の先頭で見つかった場合) も含め、 32 // 見つからなかった場合は false を返すため、厳密な比較 (=== または !==) が重要です。 33 if ($position !== false) { 34 echo "見つかりました。開始位置: {$position}\n"; 35 } else { 36 echo "見つかりませんでした。\n"; 37 } 38 } 39 40 echo "\n--- 補足 ---\n"; 41 echo "stripos() は、「case-insensitive (大文字・小文字を区別しない)」検索を行います。\n"; 42 echo "もし「case-sensitive (大文字・小文字を区別する)」検索を行いたい場合は、\n"; 43 echo "strpos() 関数を使用してください。\n"; 44} 45 46// 関数の実行 47demonstrateStripos();
PHPのstripos関数は、指定された文字列の中から別の文字列が大文字・小文字を区別せずに(case-insensitive)存在するかどうかを検索し、最初に見つかった位置を返す関数です。
この関数は、$haystackという検索対象の文字列の中から、$needleという検索したい文字列を探します。文字列が見つかった場合、その文字列が始まる位置を数値(オフセット)として返します。この位置は0から始まります。もし文字列が見つからなかった場合は、falseが返されます。検索開始位置を任意に指定できる$offset引数もありますが、省略可能です。
サンプルコードでは、"Hello PHP World! Let's learn php programming."という文字列を検索対象に、"php"や"PHP"、"World"や"world"といった様々な大文字・小文字の組み合わせで検索を行っています。striposは「php」と「PHP」を区別せず、同じ開始位置を返すことで、そのcase-insensitiveな特性を示しています。戻り値が0の場合も有効な位置を示すため、見つからなかったことを判定するには$position !== falseのような厳密な比較が重要になります。
大文字・小文字を区別する(case-sensitive)検索を行いたい場合は、strpos関数を使用してください。
stripos関数は、文字列の中から指定した部分文字列を「大文字・小文字を区別せずに」検索する点が最も重要です。例えば「php」と「PHP」は同じものとして扱われます。検索結果が見つからない場合はfalseを返しますが、文字列の先頭(0番目の位置)で見つかった場合もint 0を返します。この0とfalseは、通常の比較演算子(==)を使うとtrueと判断されてしまうため、結果の判定には厳密な比較演算子(===または!==)を必ず使用してください。これにより、意図しない誤動作を防ぎ、安全にコードを利用できます。もし大文字・小文字を区別して検索したい場合は、代わりにstrpos関数を使用してください。
PHP striposで部分文字列を検索する
1<?php 2 3/** 4 * demonstrateStripos() 5 * 6 * stripos() 関数を使用して、文字列内で部分文字列を大文字小文字を区別せずに検索し、 7 * その位置を返す方法、または見つからない場合に false を返す方法を示します。 8 * 9 * @return void 10 */ 11function demonstrateStripos(): void 12{ 13 $haystack = "Hello, World! This is a PHP 8 example."; 14 $needleFound = "world"; // 大文字小文字を区別しない検索 15 $needleFoundWithOffset = "php"; // オフセットを指定して検索 16 $needleNotFound = "java"; // 見つからない部分文字列 17 18 echo "検索対象の文字列: '{$haystack}'\n\n"; 19 20 // 例1: 部分文字列が見つかる場合 (大文字小文字を区別しない) 21 // "world" は "World" として見つかる 22 $position1 = stripos($haystack, $needleFound); 23 24 // stripos は見つかった位置(0から始まるインデックス)または false を返すため、 25 // 0 の場合と false の場合を厳密に区別するために `!== false` を使用します。 26 if ($position1 !== false) { 27 echo "例1: '{$needleFound}' が位置 {$position1} で見つかりました。\n"; 28 echo "その位置からの部分文字列: " . substr($haystack, $position1) . "\n\n"; 29 } else { 30 echo "例1: '{$needleFound}' は見つかりませんでした。\n\n"; 31 } 32 33 // 例2: 部分文字列が見つからない場合 34 $position2 = stripos($haystack, $needleNotFound); 35 36 if ($position2 !== false) { 37 echo "例2: '{$needleNotFound}' が位置 {$position2} で見つかりました。\n\n"; 38 } else { 39 echo "例2: '{$needleNotFound}' は見つかりませんでした。\n\n"; 40 } 41 42 // 例3: 検索開始位置 (オフセット) を指定する場合 43 // 文字列 "PHP" を検索対象の先頭から20文字目以降で検索します。 44 // "Hello, World! This is a PHP 8 example." 45 // 0 1 2 46 // 012345678901234567890123456789012345 47 // ^ (offset 20) 48 $offset = 20; 49 $position3 = stripos($haystack, $needleFoundWithOffset, $offset); 50 51 if ($position3 !== false) { 52 echo "例3: '{$needleFoundWithOffset}' がオフセット {$offset} 以降、位置 {$position3} で見つかりました。\n"; 53 echo "その位置からの部分文字列: " . substr($haystack, $position3) . "\n\n"; 54 } else { 55 echo "例3: '{$needleFoundWithOffset}' はオフセット {$offset} 以降では見つかりませんでした。\n\n"; 56 } 57 58 // 例4: オフセットが大きすぎて部分文字列が見つからない場合 59 $offsetTooLarge = 30; // "PHP" が現れる位置より後のオフセット 60 $position4 = stripos($haystack, $needleFoundWithOffset, $offsetTooLarge); 61 62 if ($position4 !== false) { 63 echo "例4: '{$needleFoundWithOffset}' がオフセット {$offsetTooLarge} 以降、位置 {$position4} で見つかりました。\n\n"; 64 } else { 65 echo "例4: '{$needleFoundWithOffset}' はオフセット {$offsetTooLarge} 以降では見つかりませんでした。\n\n"; 66 } 67} 68 69// 関数を実行して stripos の動作を確認します。 70demonstrateStripos(); 71 72?>
PHP 8のstripos()関数は、指定した文字列($haystack)の中から、特定の部分文字列($needle)を大文字小文字を区別せずに検索し、最初に見つかった位置を返す関数です。検索は0から始まるインデックスで行われます。三番目の引数である$offsetに数値を指定すると、その位置から検索を開始することができます。
部分文字列が見つかった場合、stripos()関数は$haystack内で$needleが開始される位置(0からのインデックス)を整数で返します。例えば、文字列の先頭で見つかった場合は0が返されます。一方、部分文字列が見つからなかった場合は、falseが返されます。そのため、戻り値が0の場合とfalseの場合を厳密に区別するために、比較演算子!== falseを使用することが推奨されます。
サンプルコードでは、"Hello, World! This is a PHP 8 example."という文字列から"world"を検索し、大文字小文字を無視してその位置を特定する例が示されています。また、検索開始位置を20文字目以降に指定して"php"を検索する例や、検索対象の部分文字列が見つからない場合にfalseが返される様子も確認できます。この関数は、文字列内の特定のキーワードを柔軟に探す際に非常に便利です。
PHPのstripos関数は、文字列内を大文字小文字を区別せずに検索し、最初に見つかった部分文字列の開始位置を整数で返します。部分文字列が見つからなかった場合はfalseを返します。特に注意が必要なのは、部分文字列が検索対象の文字列の先頭で見つかった場合、戻り値が0になる点です。PHPの型変換の特性上、0はfalseと同等と見なされることがあるため、部分文字列が見つかったかどうかを判定する際は、if ($position !== false)のように厳密な比較演算子!==を必ず使用してください。これにより、先頭で見つかった場合でも正しく処理できます。また、$offset引数で検索開始位置を指定できますが、戻り値は常に元の文字列の先頭からの絶対位置を示しますのでご注意ください。
stripos の正しい使い方と注意点
1<?php 2 3/** 4 * Searches for the first occurrence of a case-insensitive substring within a string. 5 * This function demonstrates how to correctly handle the return value of `stripos()`, 6 * especially when the substring is found at the beginning (index 0) or not found (`false`). 7 * 8 * The common issue "php stripos not working" often arises from 9 * using loose comparison (`==`) where `0` (found at beginning) is evaluated as `false`. 10 * Using strict comparison (`===`) correctly distinguishes between these two cases. 11 * 12 * @param string $haystack The string to search in. 13 * @param string $needle The substring to search for (case-insensitive). 14 * @param int $offset The offset to start the search from. Defaults to 0. 15 * @return void Outputs the search result. 16 */ 17function findSubstringCaseInsensitive(string $haystack, string $needle, int $offset = 0): void 18{ 19 echo "--- Search Details ---\n"; 20 echo "Searching in: '{$haystack}'\n"; 21 echo "For: '{$needle}' (case-insensitive)\n"; 22 echo "Starting from offset: {$offset}\n"; 23 24 // Use stripos() for case-insensitive searching. 25 // It returns the position (int) if found, or false if not found. 26 $position = stripos($haystack, $needle, $offset); 27 28 // IMPORTANT: Use strict comparison (===) to check the return value. 29 // stripos() returns 0 if the needle is at the very beginning of the haystack. 30 // In PHP, 0 == false is true (loose comparison), which can lead to unexpected behavior 31 // if you simply use `if ($position)` or `if ($position == false)`. 32 // By using $position === false, we correctly differentiate between: 33 // - The substring not being found (false). 34 // - The substring being found at the very beginning (0). 35 if ($position === false) { 36 echo "Result: '{$needle}' was NOT found in the string.\n"; 37 } else { 38 echo "Result: '{$needle}' was found at position: {$position}.\n"; 39 } 40 echo "----------------------\n\n"; 41} 42 43// --- Sample Usage --- 44 45// 1. Substring found at the beginning (stripos returns 0) 46findSubstringCaseInsensitive("Hello World", "hello"); 47 48// 2. Substring found in the middle (stripos returns a positive integer) 49findSubstringCaseInsensitive("Hello World", "world"); 50 51// 3. Substring not found (stripos returns false) 52findSubstringCaseInsensitive("Hello World", "PHP"); 53 54// 4. Substring not found when searching from a specific offset 55findSubstringCaseInsensitive("Hello World", "hello", 1); 56 57// 5. Substring found with a specific offset 58findSubstringCaseInsensitive("PHP is a great language", "language", 15);
PHPのstripos関数は、指定した文字列($haystack)の中から、検索したい部分文字列($needle)が大文字・小文字を区別せずに最初に現れる位置を検索する関数です。オプションとして、検索を開始する位置を$offset引数で指定できます。
この関数は、部分文字列が見つかった場合、その開始位置を整数のインデックスとして返します。特に、文字列の先頭で見つかった場合は0を返します。もし部分文字列が全く見つからなかった場合は、論理値のfalseを返します。
システムエンジニアを目指す初心者がよく経験する「php stripos not working」という問題は、この戻り値の扱いに起因することがほとんどです。PHPでは、緩やかな比較演算子(==)を使うと0とfalseが等価であると判断されます。そのため、striposが0を返した際に「部分文字列が先頭で見つかった」にも関わらず、「見つからなかった(false)」と誤って解釈してしまうことがあります。
この問題を回避し、正確な処理を行うためには、戻り値をチェックする際に厳密な比較演算子(===)を使用することが不可欠です。サンプルコードでは$position === falseと記述することで、部分文字列が先頭(0)で見つかった場合と、全く見つからなかった場合(false)を明確に区別し、期待通りの動作を実現しています。
stripos関数は、大文字小文字を区別せずに文字列を検索し、見つかった場合はその位置を数値で、見つからなかった場合はfalseを返します。最も注意すべき点は、検索文字列が先頭で見つかった際に0を返すことです。PHPでは0とfalseは「==」(ゆるい比較)を使うと等しいと判断されてしまうため、if ($position == false)のように記述すると、先頭で見つかった場合も「見つからなかった」と誤判定してしまいます。この問題を避けるため、falseとの比較には必ず「===」(厳密な比較)を使用してください。if ($position === false)と書くことで、0とfalseを正しく区別し、プログラムを安全かつ正確に動作させることができます。