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

strstr関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

strstr関数は、ある文字列(haystack)の中から特定の文字列(needle)を検索し、その見つかった部分以降の文字列を返す関数です。この関数は、文字列の一部を抽出したり、特定の区切り文字以降の情報を取得したりする際に役立ちます。

第一引数には検索の対象となる元の文字列を、第二引数にはその文字列内で検索したい文字列を指定します。オプションの第三引数before_needletrueを指定すると、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_needletrueを指定すると、$needleが見つかった位置の手前までの文字列を返します。$needleが見つからなかった場合は、falseを返します。

一方、strpos関数も同様に部分文字列を検索しますが、戻り値の型が異なります。strpos$needleが見つかった場合、その開始位置を数値(インデックス)で返します。文字列の先頭で見つかった場合は0を返し、見つからなかった場合はfalseを返します。

したがって、strstrは部分文字列そのものやその周辺の「文字列」が必要な場合に使い、strposは部分文字列の「位置」を知りたい場合に用います。特にstrposの場合、0という数値が有効な位置を示すため、falseと区別するために厳密な比較演算子(===!==)を使用することが非常に重要です。

PHPのstrstrstrposは、文字列内の部分文字列を検索する点で共通しますが、戻り値の型が異なりますので注意が必要です。strstrは部分文字列が見つかった場合、その部分文字列を含む以降の文字列(または第3引数trueで手前まで)を返し、見つからない場合はfalseを返します。一方、strposは見つかった位置を数値インデックス(0から始まる)で返し、見つからない場合はfalseを返します。特にstrposで文字列の先頭で見つかった場合、0を返しますが、これはfalseとは異なる「有効な位置」です。そのため、部分文字列が見つからなかったことを判定する際は、=== false!== falseのような厳密な比較演算子を使用することが非常に重要です。これにより、0が見つからないものとして扱われる誤りを防ぎ、コードを安全かつ正確に利用できます。

関連コンテンツ

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