PHPのstrstr
関数は、探したい文字列の中から、指定した別の文字列が最初に現れる位置から元の文字列の最後までを抽出するために使用されます。
この関数は、文字列の中から特定の区切り文字やキーワード以降のテキストを切り出したい場合に非常に便利です。
たとえば、URLからプロトコルを除いた部分を取り出したり、ファイルパスからファイル名を取得したりする際に役立ちます。
また、大文字と小文字を区別しない検索を行いたい場合は、関連関数のstristr
関数を使用することができます。
この記事では、strstr
関数の基本的な使い方、引数、戻り値、主要な使用例、そして使用する際の重要な注意点について解説します。
strstr関数の基本的な構文
strstr
関数の基本的な構文は以下の通りです。
strstr(string $haystack, string $needle, bool $before_needle = false): string|false
$haystack
: 必須。検索対象となる元の文字列です。$needle
: 必須。$haystack
内で検索したい文字列です。$before_needle
: オプション。true
を指定すると、$needle
が見つかった位置から手前($needle
を含まない)の部分を返します。デフォルトはfalse
です。
戻り値
$needle
が見つかった場合は、指定されたサブ文字列。
$needle
が見つからなかった場合は false
が返されます。
重要な点:
* strstr
は大文字と小文字を区別します。大文字と小文字を区別せずに検索したい場合はstristr
関数を使用してください。
* false
が返される可能性があるため、戻り値を厳密にチェックする必要があります。
strstr関数を実際に使ってみる
strstr
関数を実際に使って、動作を確認してみます。
例1:基本的な使い方($before_needleがfalseの場合)
URLからプロトコル以降の部分を取得します。
<?php
$url = "https://www.example.com/path/to/page";
// 「://」以降の部分を取得
$result = strstr($url, "://");
echo $result . PHP_EOL;
// 出力: ://www.example.com/path/to/page
// 「.」以降の部分を取得
$result2 = strstr($url, ".");
echo $result2 . PHP_EOL;
// 出力: .example.com/path/to/page
$url
変数にwebページのURL文字列が入っている場合です。
最初にstrstr
関数を使って、「://
」が見つかる位置を探しています。
結果、プロトコル以下の「://www.example.com/path/to/page
」が取得できます。
同じ文字列に対して、「.
」が見つかる位置を探すと「.example
」〜以下の文字列が取得できています。
このようにstrstr
関数は$needle
自身も結果に含めます。
例2:第3引数がtrueの場合
第3引数にtrue
を指定して、探す文字列の手前までの部分を取得します。
<?php
$email = "user@example.com";
// 「@」より前の部分を取得
$username = strstr($email, "@", true);
echo $username . PHP_EOL;
// 出力: user
$email
変数にメールアドレスが入っています。
この変数に対して、strstr
関数で「@
」の位置を探しています。
第3引数にtrue
を指定しているので、「@
」が見つかった位置の手前までが取得されます。
このように第3引数を使うと、メールアドレスのユーザー名部分を抽出する際などに便利です。
例3:文字列が見つからない場合の挙動
検索対象の文字列が見つからなかった場合、strstr
関数はfalse
を返します。
<?php
$sentence = "Hello, world!";
// 「PHP」という文字列を検索
$result = strstr($sentence, "PHP");
// === で厳密に false かどうかをチェック
if ($result === false) {
echo "「PHP」は見つかりませんでした。" . PHP_EOL;
}
// 出力: 「PHP」は見つかりませんでした。
$sentence
に文字列が入っています。
$sentence
の中からPHP
という文字列をstrstr
関数で探そうとしていますが、ないためにfalse
になります。
結果、このプログラムでは「「PHP」は見つかりませんでした。
」が出力されます。
例4:大文字小文字を区別しない検索(stristr())
stristr
関数はstrstr
関数と同じ機能ですが、大文字と小文字を区別せずに検索します。
<?php
$text = "The quick brown fox jumps over the lazy dog.";
// 「fox」を検索(stristr()は「Fox」にもマッチする)
$result_i = stristr($text, "FOX");
echo $result_i . PHP_EOL;
// 出力: fox jumps over the lazy dog.
// strstr()はマッチしない
$result_s = strstr($text, "FOX");
var_dump($result_s);
// 出力: bool(false)
$text
に文字列が入っています。
この文字列に対して、stristr
関数とstrstr
関数で「FOX
」という文字列を探しています。
stristr
関数では文字列が見つかりますが、strstr
関数では大文字小文字を区別するため見つかりません。
このようにstristr
関数は、大文字と小文字を区別したくない場合に非常に便利です。
strstr関数を使う際の注意点
strstr関数を使う際の注意点についてです。
falseの厳密な比較
文字列が見つからない場合はfalse
が返されます。
検索結果が空文字列(""
)や0
などと見分けがつかなくなることを避けるため、=== false
で厳密にチェックすると良いです。
大文字小文字を区別
strstr
関数は大文字と小文字を区別します。
この挙動が期待と異なる場合は、代わりに stristr
関数を使用してください。
strstr関数とstrpos関数
strstr
関数は、見つかった位置から元の文字列の最後までを返す。strpos
関数は、見つかった位置のインデックス(数値)を返す。
どちらを使うべきかは、やりたいことによって異なります。
文字列の残りの部分が欲しいならstrstr
関数、見つかった位置のインデックスだけが欲しいならstrpos
関数が適しています。
マルチバイト文字列
strstr
はバイト単位で動作し、マルチバイト文字エンコーディング(UTF-8など)を正しく扱いません。
マルチバイト文字列を安全に検索したい場合は、mb_strstr
関数を使用してください。
<?php
// mb_strstr関数がない場合、このコードは動きません
$multibyte_str = "あいうえお";
$result_mb = mb_strstr($multibyte_str, "うえ", false, 'UTF-8');
echo $result_mb . PHP_EOL;
// 出力: うえお
まとめ
PHPのstrstr
関数は、文字列内の指定した部分文字列が最初に現れる位置から、元の文字列の最後までを抽出するための関数です。
第3引数を使うことで、見つかった部分文字列の手前までを抽出することもでき、非常に柔軟に利用できます。
ただし、strstr
関数がfalse
を返す場合の厳密な比較、大文字小文字の区別、そしてマルチバイト文字への非対応といった点に注意しましょう。
これらのポイントを踏まえ、strstr
関数と関連する関数を効果的に活用し、PHPアプリケーションにおける文字列処理を効率的に行いましょう。
コメント