PHP 8.3.4 Released!

strstr

(PHP 4, PHP 5, PHP 7, PHP 8)

strstr查找字符串的首次出现

说明

strstr(string $haystack, string $needle, bool $before_needle = false): string|false

返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。

注意:

该函数区分大小写。如果想要不区分大小写,请使用 stristr()

注意:

如果只需要确定特定的 needle 是否存在于 haystack 中,应该使用更快且更少占用内存的 str_contains() 函数。

参数

haystack

输入字符串。

needle

要搜索的字符串。

Prior to PHP 8.0.0, if needle is not a string, it is converted to an integer and applied as the ordinal value of a character. This behavior is deprecated as of PHP 7.3.0, and relying on it is highly discouraged. Depending on the intended behavior, the needle should either be explicitly cast to string, or an explicit call to chr() should be performed.

before_needle

若为 truestrstr() 将返回 needlehaystack 中的位置之前的部分。

返回值

返回字符串的一部分或者 false(如果未发现 needle)。

更新日志

版本 说明
8.0.0 needle 现在接受空字符串。
8.0.0 不再支持传递 int 作为 needle
7.3.0 弃用传递 int 作为 needle

示例

示例 #1 strstr() 示例

<?php
$email
= 'name@example.com';
$domain = strstr($email, '@');
echo
$domain; // 打印 @example.com

$user = strstr($email, '@', true);
echo
$user; // 打印 name
?>

参见

  • preg_match() - 执行匹配正则表达式
  • stristr() - strstr 函数的忽略大小写版本
  • strpos() - 查找字符串首次出现的位置
  • strrchr() - 查找指定字符在字符串中的最后一次出现
  • substr() - 返回字符串的子串

add a note

User Contributed Notes 10 notes

up
41
laszlo dot heredy at gmail dot com
10 years ago
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.
up
12
xslidian at lidian dot info
11 years ago
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);
}
?>
up
7
Gevorg Melkumyan
3 years ago
Don't confuse this function with strtr ) I lost like 1 hour on that
up
16
gruessle at gmail dot com
12 years ago
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));
}

?>
up
9
w3b_monk3y at yahoo dot com
15 years ago
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.
up
9
brett dot jr dot alton at gmail dot com
16 years ago
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
?>
up
0
Julian Egelstaff
1 year ago
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;
?>
up
-2
trent dot renshaw at objectst dot com dot au
8 years ago
> 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);
up
-20
root at mantoru dot de
16 years ago
Please note that $needle is included in the return string, as shown in the example above. This ist not always desired behavior, _especially_ in the mentioned example. Use this if you want everything AFTER $needle.

<?php
function strstr_after($haystack, $needle, $case_insensitive = false) {
$strpos = ($case_insensitive) ? 'stripos' : 'strpos';
$pos = $strpos($haystack, $needle);
if (
is_int($pos)) {
return
substr($haystack, $pos + strlen($needle));
}
// Most likely false or null
return $pos;
}

// Example
$email = 'name@example.com';
$domain = strstr_after($email, '@');
echo
$domain; // prints example.com
?>
up
-25
leo dot nard at free dot fr
18 years ago
When encoding ASCII strings to HTML size-limited strings, sometimes some HTML special chars were cut.

For example, when encoding "��" to a string of size 10, you would get: "à&a" => the second character is cut.

This function will remove any unterminated HTML special characters from the string...

<?php
function cut_html($string)
{
$a=$string;

while (
$a = strstr($a, '&'))
{
echo
"'".$a."'\n";
$b=strstr($a, ';');
if (!
$b)
{
echo
"couper...\n";
$nb=strlen($a);
return
substr($string, 0, strlen($string)-$nb);
}
$a=substr($a,1,strlen($a)-1);
}
return
$string;
}
?>
To Top