【PHP8.x】strstr()関数の使い方
strstr関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
strstr関数は、ある文字列(haystack)の中から特定の文字列(needle)を検索し、その見つかった部分以降の文字列を返す関数です。この関数は、文字列の一部を抽出したり、特定の区切り文字以降の情報を取得したりする際に役立ちます。
第一引数には検索の対象となる元の文字列を、第二引数にはその文字列内で検索したい文字列を指定します。オプションの第三引数before_needleにtrueを指定すると、needleが見つかった場合、needleより前の部分の文字列を返します。この引数を省略するかfalseを指定した場合、needleが見つかれば、そのneedleを含むそれ以降の文字列を返します。
検索対象の文字列内にneedleが見つからなかった場合、この関数はfalseを返します。strstr関数は、大文字と小文字を区別して検索を行いますので注意が必要です。例えば、「Hello」と「hello」は異なるものとして扱われます。大文字小文字を区別せずに検索を行いたい場合は、stristr関数を使用してください。
また、PHP 8.0.0以降のバージョンでは、第二引数needleに空文字列("")を指定すると、E_WARNINGという警告が発行され、空文字列が戻り値として返されます。例えば、メールアドレスのドメイン部分を抽出したり、ファイルパスからファイル名を特定したりするなど、文字列操作の基本として幅広い場面で利用されます。
構文(syntax)
1<?php 2 3// 構文: strstr(検索対象の文字列, 検索する文字列); 4 5$email = 'name@example.com'; 6$domain = strstr($email, '@'); 7 8echo $domain; // 結果: @example.com 9 10?>
引数(parameters)
string $haystack, string $needle, bool $before_needle = false
- string $haystack: 検索対象の文字列を指定します。
- string $needle: 検索したい部分文字列を指定します。
- bool $before_needle = false: trueを指定すると、$needleよりも前の部分文字列を返します。デフォルトはfalseで、$needle以降の部分文字列を返します。
戻り値(return)
string|false
文字列 haystack の中で、文字列 needle が最初に出現する位置から文字列の最後までを返します。needle が見つからない場合は false を返します。
サンプルコード
PHP strstr関数で文字列を検索する
1<?php 2 3// 検索対象の文字列(Haystack) 4$haystack = "PHP programming is fun and powerful."; 5 6// 検索したい部分文字列(Needle) 7$needle = "programming"; 8 9// 見つからないことを示すための部分文字列 10$notFoundNeedle = "language"; 11 12echo "--- strstr() 関数の使用例 ---\n\n"; 13 14// 1. $needle が見つかった場合、その $needle から文字列の終わりまでを返す(デフォルトの挙動) 15// 第3引数 ($before_needle) を省略するか false にするとこの挙動になります。 16echo "検索対象: '{$haystack}'\n"; 17echo "検索文字列: '{$needle}'\n"; 18$resultDefault = strstr($haystack, $needle); 19 20if ($resultDefault !== false) { 21 echo "結果 (検索文字列以降): '{$resultDefault}'\n\n"; 22} else { 23 echo "検索文字列 '{$needle}' は見つかりませんでした。\n\n"; 24} 25 26// 2. $needle が見つかった場合、その $needle より前の部分を返す 27// 第3引数 ($before_needle) に true を指定します。 28echo "検索対象: '{$haystack}'\n"; 29echo "検索文字列: '{$needle}'\n"; 30$resultBeforeNeedle = strstr($haystack, $needle, true); 31 32if ($resultBeforeNeedle !== false) { 33 echo "結果 (検索文字列以前): '{$resultBeforeNeedle}'\n\n"; 34} else { 35 echo "検索文字列 '{$needle}' は見つかりませんでした。\n\n"; 36} 37 38// 3. $needle が見つからなかった場合 39// strstr() は false を返します。厳密な比較 (=== false または !== false) を推奨します。 40echo "検索対象: '{$haystack}'\n"; 41echo "検索文字列: '{$notFoundNeedle}'\n"; 42$resultNotFound = strstr($haystack, $notFoundNeedle); 43 44if ($resultNotFound !== false) { 45 echo "結果 (検索文字列以降): '{$resultNotFound}'\n\n"; 46} else { 47 echo "結果: 検索文字列 '{$notFoundNeedle}' は見つかりませんでした。(false を返します)\n\n"; 48} 49 50?>
PHPのstrstr関数は、指定した文字列の中から特定の部分文字列を検索し、その見つかった位置から文字列の一部を切り出す機能を提供します。
この関数は、第一引数$haystackに「検索対象となる元の文字列」を、第二引数$needleに「検索したい部分文字列」を指定して使用します。
第三引数$before_needleはオプションで、bool型の値を取ります。この引数をtrueに設定すると、見つかった$needleより前の部分の文字列が戻り値として返されます。一方、$before_needleを省略するかfalseに設定した場合、見つかった$needleから文字列の最後までが返されます。
もし、指定した$needleが$haystackの中に見つからなかった場合、strstr関数はfalseを返します。そのため、関数からの戻り値を評価する際には、!== falseや=== falseのような厳密な比較を行うことが推奨されます。この関数を使うことで、文字列の中から特定の区切り文字を基準に、必要な情報を効率的に抽出できます。
strstr関数は、検索文字列が見つからない場合にfalseを返します。このfalseは空文字列""とは異なるため、結果を判定する際は=== falseや!== falseのような厳密な比較を必ず使用してください。
第3引数をtrueにすると、検索文字列より前の部分を返します。省略するかfalseにすると、検索文字列が見つかった位置から文字列の最後までを返しますので、用途に応じて使い分けてください。
また、strstrは大文字・小文字を区別して検索します。大文字・小文字を区別しない検索が必要な場合は、stristr関数を利用することをご検討ください。
PHP: strstr と strpos の違いを理解する
1<?php 2 3/** 4 * strstr と strpos の違いを理解するためのサンプルコード。 5 * 6 * strstr は指定した部分文字列が見つかった位置から、元の文字列の残りの部分を返します。 7 * strpos は指定した部分文字列が最初に見つかった位置 (数値インデックス) を返します。 8 * どちらの関数も、部分文字列が見つからない場合は boolean false を返します。 9 */ 10 11// 検索対象となる元の文字列を定義します。 12$haystack = "Welcome to PHP programming. PHP is a versatile language."; 13// 検索する部分文字列を定義します。 14$needle = "PHP"; 15// 存在しない部分文字列の例 16$nonExistentNeedle = "Python"; 17 18echo "元の文字列: '{$haystack}'\n"; 19echo "検索する部分文字列: '{$needle}'\n\n"; 20 21// --- strstr の使用例 --- 22echo "--- strstr の使用例 ---\n"; 23 24// strstr は、$needle が最初に見つかった位置から文字列の最後までを返します。 25$resultStrstr = strstr($haystack, $needle); 26if ($resultStrstr !== false) { 27 echo "strstr(\$haystack, \$needle) の結果: '{$resultStrstr}'\n"; 28 echo " (説明: '{$needle}' が見つかった位置から、その部分文字列を含めて以降の文字列を返します。)\n"; 29} else { 30 echo "strstr(\$haystack, \$needle) の結果: 部分文字列は見つかりませんでした。\n"; 31} 32 33echo "\n"; 34 35// strstr の第3引数 $before_needle を true にすると、 36// $needle が見つかった位置の手前までの文字列を返します。 37$resultStrstrBefore = strstr($haystack, $needle, true); 38if ($resultStrstrBefore !== false) { 39 echo "strstr(\$haystack, \$needle, true) の結果: '{$resultStrstrBefore}'\n"; 40 echo " (説明: '{$needle}' が見つかった位置の手前までの文字列を返します。)\n"; 41} else { 42 echo "strstr(\$haystack, \$needle, true) の結果: 部分文字列は見つかりませんでした。\n"; 43} 44 45echo "\n"; 46 47// 存在しない部分文字列を strstr で検索した場合 48$resultStrstrNotFound = strstr($haystack, $nonExistentNeedle); 49if ($resultStrstrNotFound === false) { 50 echo "strstr(\$haystack, '{$nonExistentNeedle}') の結果: false (部分文字列は見つかりませんでした)\n"; 51} 52 53echo "\n\n"; 54 55// --- strpos の使用例 --- 56echo "--- strpos の使用例 ---\n"; 57 58// strpos は、$needle が最初に見つかった位置のインデックス (0から始まる) を返します。 59// 文字列の先頭で見つかった場合は 0 を返します。 60$resultStrpos = strpos($haystack, $needle); 61if ($resultStrpos !== false) { // 0 も有効な位置なので、厳密に false かどうかをチェックします。 62 echo "strpos(\$haystack, \$needle) の結果: {$resultStrpos}\n"; 63 echo " (説明: '{$needle}' が最初に見つかった位置のインデックス (0 から始まる数値) を返します。)\n"; 64} else { 65 echo "strpos(\$haystack, \$needle) の結果: 部分文字列は見つかりませんでした。\n"; 66} 67 68echo "\n"; 69 70// 存在しない部分文字列を strpos で検索した場合 71$resultStrposNotFound = strpos($haystack, $nonExistentNeedle); 72if ($resultStrposNotFound === false) { 73 echo "strpos(\$haystack, '{$nonExistentNeedle}') の結果: false (部分文字列は見つかりませんでした)\n"; 74} 75 76echo "\n\n"; 77 78// --- strstr と strpos の主な違いのまとめ --- 79echo "--- strstr と strpos の主な違い ---\n"; 80echo " - strstr は、部分文字列が見つかった場合は '文字列の一部' (string) を返します。\n"; 81echo " - strpos は、部分文字列が見つかった場合は '位置' (integer) を返します。\n"; 82echo " - どちらの関数も、部分文字列が見つからなかった場合は boolean false を返します。\n"; 83echo " - strpos の戻り値が 0 の場合、部分文字列が文字列の先頭で見つかったことを意味するため、\n"; 84echo " 見つからなかった場合と区別するために厳密な比較演算子 (=== または !==) を使うことが非常に重要です。\n"; 85 86?>
PHPのstrstr関数は、指定した文字列($haystack)の中から、特定の部分文字列($needle)を検索するために使用されます。$needleが見つかった場合、strstrはその$needleが見つかった位置から$haystackの最後までを新しい文字列として返します。もし第三引数$before_needleにtrueを指定すると、$needleが見つかった位置の手前までの文字列を返します。$needleが見つからなかった場合は、falseを返します。
一方、strpos関数も同様に部分文字列を検索しますが、戻り値の型が異なります。strposは$needleが見つかった場合、その開始位置を数値(インデックス)で返します。文字列の先頭で見つかった場合は0を返し、見つからなかった場合はfalseを返します。
したがって、strstrは部分文字列そのものやその周辺の「文字列」が必要な場合に使い、strposは部分文字列の「位置」を知りたい場合に用います。特にstrposの場合、0という数値が有効な位置を示すため、falseと区別するために厳密な比較演算子(===や!==)を使用することが非常に重要です。
PHPのstrstrとstrposは、文字列内の部分文字列を検索する点で共通しますが、戻り値の型が異なりますので注意が必要です。strstrは部分文字列が見つかった場合、その部分文字列を含む以降の文字列(または第3引数trueで手前まで)を返し、見つからない場合はfalseを返します。一方、strposは見つかった位置を数値インデックス(0から始まる)で返し、見つからない場合はfalseを返します。特にstrposで文字列の先頭で見つかった場合、0を返しますが、これはfalseとは異なる「有効な位置」です。そのため、部分文字列が見つからなかったことを判定する際は、=== falseや!== falseのような厳密な比較演算子を使用することが非常に重要です。これにより、0が見つからないものとして扱われる誤りを防ぎ、コードを安全かつ正確に利用できます。
PHP strstr 関数で部分文字列を検索・取得する
1<?php 2 3/** 4 * PHPのstrstr関数の基本的な使い方を示すサンプル関数です。 5 * 6 * strstr関数は、指定した文字列 (needle) が別の文字列 (haystack) 内で最初に出現する場所を検索し、 7 * その部分文字列を返します。 8 * 9 * @param string $haystack 検索対象の文字列。 10 * @param string $needle 検索する文字列。 11 * @param bool $before_needle trueの場合、$needleが見つかる前の部分を返します。 12 * false (デフォルト) の場合、$needleを含む見つかった部分から後を返します。 13 * @return string|false 見つかった場合は部分文字列、見つからない場合はfalse。 14 */ 15function demonstrateStrstrUsage(): void 16{ 17 // 検索対象となる元の文字列 18 $mainString = "The quick brown fox jumps over the lazy dog."; 19 echo "元の文字列: \"{$mainString}\"\n\n"; 20 21 // --- ケース1: 検索文字列が見つかった場合 (デフォルト動作: 検索文字列を含む後ろの部分を返す) --- 22 // strstr("The quick brown fox ...", "fox") 23 // 出力: "fox jumps over the lazy dog." 24 $result1 = strstr($mainString, "fox"); 25 echo "1. 'fox' を検索 (デフォルト): " . var_export($result1, true) . "\n"; 26 echo " (期待される出力: 'fox jumps over the lazy dog.')\n\n"; 27 28 // --- ケース2: 検索文字列が見つかった場合 (第三引数を true に設定: 検索文字列より前の部分を返す) --- 29 // strstr("The quick brown fox ...", "fox", true) 30 // 出力: "The quick brown " 31 $result2 = strstr($mainString, "fox", true); 32 echo "2. 'fox' を検索 (前まで): " . var_export($result2, true) . "\n"; 33 echo " (期待される出力: 'The quick brown ')\n\n"; 34 35 // --- ケース3: 検索文字列が見つからなかった場合 --- 36 // strstr("The quick brown fox ...", "elephant") 37 // 出力: false 38 $result3 = strstr($mainString, "elephant"); 39 echo "3. 'elephant' を検索 (見つからない): " . var_export($result3, true) . "\n"; 40 echo " (期待される出力: false)\n\n"; 41 42 // --- ケース4: strstrは大文字と小文字を区別する --- 43 // strstr("The quick brown fox ...", "Fox") 44 // 出力: false (元の文字列の 'f' は小文字のため) 45 $result4 = strstr($mainString, "Fox"); 46 echo "4. 'Fox' を検索 (大文字小文字区別): " . var_export($result4, true) . "\n"; 47 echo " (期待される出力: false - 元の文字列の'f'が小文字のため)\n"; 48 echo " 大文字小文字を区別しない検索には stristr() 関数を使用してください。\n"; 49} 50 51// 関数を実行して、strstrの動作を確認します。 52demonstrateStrstrUsage(); 53 54?>
PHPのstrstr関数は、指定した文字列($haystack)の中から、特定の文字列($needle)が最初に出現する位置を検索し、その部分文字列を返すための関数です。
第一引数$haystackには検索対象となる元の文字列を、第二引数$needleには検索したい文字列を指定します。第三引数$before_needleはオプションで、trueを設定すると$needleが見つかるまでの部分文字列を返します。false(デフォルト)の場合、$needleを含んだ、それ以降の部分文字列を返します。
検索文字列が見つかった場合は部分文字列を返しますが、見つからなかった場合はfalseを返します。この関数は、大文字と小文字を厳密に区別して検索します。大文字小文字を区別せずに検索したい場合は、stristr関数を使用してください。
サンプルコードでは、"The quick brown fox jumps over the lazy dog."という文字列を例に、strstr関数の動作を説明しています。"fox"を検索した場合、デフォルトでは"fox jumps over the lazy dog."が返されます。$before_needleをtrueにして"fox"を検索すると、"The quick brown "が返されます。存在しない文字列"elephant"を検索した際にはfalseが返され、大文字小文字を区別するため、"Fox"を検索してもfalseが返されることが示されています。この関数は、文字列から必要な部分を効率的に抽出する際に活用できます。
strstr関数は、検索文字列が見つかればその部分文字列を、見つからなければfalseを返します。第三引数をtrueに設定すると、検索文字列より前の部分を取得できます。
この関数は、大文字と小文字を厳密に区別します。大文字小文字を区別せずに検索したい場合は、stristr関数を使用してください。
最も重要な注意点は、検索文字列が見つからなかった場合にfalseが返されることです。PHPではfalseと空文字列が緩い比較で等価とみなされる場合があるため、戻り値を確認する際は、厳密な比較演算子(===)を用いてfalseかどうかを必ず判別し、適切なエラー処理や条件分岐を行うようにしてください。
PHP strstr で複数キーワードを検索する
1<?php 2 3/** 4 * 指定された文字列 (haystack) の中に、複数の検索キーワード (needles) のいずれかが含まれているかをチェックします。 5 * `strstr` 関数をループで複数回呼び出すことで、複数のキーワードに対する検索を実現しています。 6 * 7 * @param string $haystack 検索対象となる元の文字列。 8 * @param array<string> $needles 検索するキーワードの配列。 9 * @return bool いずれかのキーワードが見つかった場合は `true`、一つも見つからなかった場合は `false` を返します。 10 */ 11function containsAnyKeyword(string $haystack, array $needles): bool 12{ 13 // 各キーワードに対してループを行い、`strstr` で検索します。 14 foreach ($needles as $needle) { 15 // `strstr` は、`$needle` が `$haystack` の中に最初に見つかった場合、 16 // その `$needle` から `$haystack` の終わりまでの部分文字列を返します。 17 // 見つからなかった場合は `false` を返します。 18 // デフォルトでは大文字・小文字を区別して検索します。 19 // 大文字・小文字を区別しない検索には `stristr` 関数を使用します。 20 if (strstr($haystack, $needle) !== false) { 21 // いずれかのキーワードが見つかった時点で、true を返して処理を終了します。 22 return true; 23 } 24 } 25 26 // 全てのキーワードを検索しても見つからなかった場合は、false を返します。 27 return false; 28} 29 30// --- 使用例 --- 31 32$text = "PHPはWeb開発に広く使われるプログラミング言語です。"; 33 34$keywordsToSearch1 = ["Web", "開発", "言語"]; 35if (containsAnyKeyword($text, $keywordsToSearch1)) { 36 echo "テキストに指定されたキーワードのいずれかが含まれています。\n"; 37} else { 38 echo "テキストに指定されたキーワードは含まれていません。\n"; 39} 40 41$keywordsToSearch2 = ["Python", "Java", "Ruby"]; 42if (containsAnyKeyword($text, $keywordsToSearch2)) { 43 echo "テキストに指定されたキーワードのいずれかが含まれています。\n"; 44} else { 45 echo "テキストに指定されたキーワードは含まれていません。\n"; 46} 47 48$caseSensitiveText = "Apple iPhone"; 49$caseSensitiveKeywords = ["apple"]; 50if (containsAnyKeyword($caseSensitiveText, $caseSensitiveKeywords)) { 51 echo "ケースセンシティブなキーワードが見つかりました。\n"; 52} else { 53 echo "ケースセンシティブなキーワードは見つかりませんでした。\n"; 54}
PHP 8のstrstr関数は、指定した文字列($haystack)の中から、別の文字列($needle)が最初に出現する部分を検索するために使用されます。引数$haystackには検索対象となる元の文字列を、$needleには検索したいキーワードを指定します。strstrは、$needleが見つかった場合はその位置から$haystackの最後までを含む部分文字列を返しますが、見つからなかった場合はfalseを返します。この関数はデフォルトで大文字・小文字を区別して検索します。大文字・小文字を区別しない検索にはstristr関数を使用できます。
このサンプルコードでは、strstr関数を応用し、一つの文字列の中に複数のキーワードのいずれかが含まれているかをチェックするcontainsAnyKeyword関数を定義しています。この関数は、検索対象の文字列($haystack)と検索キーワードの配列($needles)を受け取ります。内部では、foreachループを使って$needles配列の各キーワードを一つずつ取り出し、strstrで文字列内に存在するかを確認しています。もしキーワードが見つかった場合(strstrがfalse以外を返した場合)、すぐにtrueを返して処理を終了します。全てのキーワードを検索しても見つからなければ、最終的にfalseを返します。このようにstrstrを繰り返し利用することで、複数のキーワードに対する効率的な検索処理を実現しています。
PHPのstrstr関数は、指定された文字列を大文字・小文字を区別して検索します。もし大文字・小文字を区別せずに検索したい場合は、代わりにstristr関数を使用してください。
サンプルコードにおけるstrstr関数の戻り値判定では、!== falseという厳密な比較演算子が使われています。これは、PHPが持つ柔軟な型変換による予期せぬ誤判定を防ぐために非常に重要です。常に厳密な比較を心がけましょう。
このコードは、複数のキーワードに対してstrstrを繰り返し実行します。検索するキーワードが非常に多かったり、検索対象の文字列が極端に長かったりする場合、処理速度が低下する可能性があります。その際は、より効率的な正規表現関数であるpreg_matchなどの利用を検討することも有効な選択肢です。