PHPのstrstr関数の使い方!文字列を見つけた位置から抽出する

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アプリケーションにおける文字列処理を効率的に行いましょう。

PHP

コメント