strstr
(PHP 4, PHP 5, PHP 7, PHP 8)
strstr — 文字列が最初に現れる位置を見つける
説明
haystack
の中で needle
が最初に現れる場所を含めてそこから文字列の終わりまでを返します。
注意:
この関数は大文字小文字を区別することに注意してください。 大文字小文字を区別しない検索を行う場合は、stristr() を使用してください。
注意:
もし特定の
haystack
にneedle
があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用してください。
パラメータ
haystack
-
入力文字列。
needle
-
検索する文字列。
PHP 8.0.0 より前のバージョンでは、
needle
が文字列でない場合、 数値に変換され、文字の通常の値として扱われていました。 この振る舞いは PHP 7.3.0 以降では推奨されないので、 この機能を使用しないことを強く推奨します。 意図した動作に依存する場合、needle
を string に明示的にキャストするか、 明示的に chr() 関数を呼び出すべきでしょう。 before_needle
-
true
にすると、strstr() の戻り値は、haystack
の中で最初にneedle
があらわれる箇所より前の部分となります (needle は含めません)。
戻り値
部分文字列を返します。
needle
が見つからない場合は false
を返します。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 |
needle は、空文字列を受け入れるようになりました。
|
8.0.0 |
needle に数値を渡すことはサポートされなくなりました。
|
7.3.0 |
needle に数値を渡すことは非推奨になりました。
|
例
例1 strstr() の例
<?php
$email = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // @example.com と表示します
$user = strstr($email, '@', true);
echo $user; // name と表示します
?>
参考
- stristr() - 大文字小文字を区別しない strstr
- strrchr() - 文字列中に文字が最後に現れる場所を取得する
- strpos() - 文字列内の部分文字列が最初に現れる場所を見つける
- strpbrk() - 文字列の中から任意の文字を探す
- preg_match() - 正規表現によるマッチングを行う
User Contributed Notes 8 notes
strstr() is not a way to avoid type-checking with strpos().
If $needle is the last character in $haystack, and testing $needle as a boolean by itself would evaluate to false, then testing strstr() as a boolean will evaluate to false (because, if successful, strstr() returns the first occurrence of $needle along with the rest of $haystack).
<?php
findZero('01234'); // found a zero
findZero('43210'); // did not find a zero
findZero('0'); // did not find a zero
findZero('00'); // found a zero
findZero('000'); // found a zero
findZero('10'); // did not find a zero
findZero('100'); // found a zero
function findZero($numberString) {
if (strstr($numberString, '0')) {
echo 'found a zero';
} else {
echo 'did not find a zero';
}
}
?>
Also, strstr() is far more memory-intensive than strpos(), especially with longer strings as your $haystack, so if you are not interested in the substring that strstr() returns, you shouldn't be using it anyway.
There is no PHP function just to check only _if_ $needle occurs in $haystack; strpos() tells you if it _doesn't_ by returning false, but, if it does occur, it tells you _where_ it occurs as an integer, which is 0 (zero) if $needle is the first part of $haystack, which is why testing if (strpos($needle, $haystack)===false) is the only way to know for sure if $needle is not part of $haystack.
My advice is to start loving type checking immediately, and to familiarize yourself with the return value of the functions you are using.
Cheers.
Lookout for logic inversion in old code!
In PHP 8, if the needle is an empty string, this function will return 0 (not false), implying the first character of the string matches the needle. Before PHP 8, it would return false when the needle is an empty string.
There other string functions that are affected by similar issues in PHP 8: strpos(), strrpos(), stripos(), strripos(), strchr(), strrchr(), stristr(), and this function, strstr()
If you are checking if the return value === false then you will be misled by this new behaviour. You also need to check if the needle was an empty string. Basically, something like this:
<?php
$result = $needle ? strstr($haystack, $needle) : false;
?>
For those in need of the last occurrence of a string:
<?php
function strrstr($h, $n, $before = false) {
$rpos = strrpos($h, $n);
if($rpos === false) return false;
if($before == false) return substr($h, $rpos);
else return substr($h, 0, $rpos);
}
?>
Been using this for years:
<?php
/**
*
* @author : Dennis T Kaplan
*
* @version : 1.0
* Date : June 17, 2007
* Function : reverse strstr()
* Purpose : Returns part of haystack string from start to the first occurrence of needle
* $haystack = 'this/that/whatever';
* $result = rstrstr($haystack, '/')
* $result == this
*
* @access public
* @param string $haystack, string $needle
* @return string
**/
function rstrstr($haystack,$needle)
{
return substr($haystack, 0,strpos($haystack, $needle));
}
?>
You could change it to:
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php
function rstrstr($haystack,$needle, $start=0)
{
return substr($haystack, $start,strpos($haystack, $needle));
}
?>
If you want to emulate strstr's new before_needle parameter pre 5.3 strtok is faster than using strpos to find the needle and cutting with substr. The amount of difference varies with string size but strtok is always faster.
For the needle_before (first occurance) parameter when using PHP 5.x or less, try:
<?php
$haystack = 'php-homepage-20071125.png';
$needle = '-';
$result = substr($haystack, 0, strpos($haystack, $needle)); // $result = php
?>
> root at mantoru dot de
PHP makes this easy for you. When working with domain portion of email addresses, simply pass the return of strstr() to substr() and start at 1:
substr(strstr($haystack, '@'), 1);