PHP Conference Japan 2024

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

要搜索的字符串。

在 PHP 8.0.0 之前,如果 needle 不是字符串,则将其转换为整数并将其应用为字符的序数值。此行为自 PHP 7.3.0 起已弃用,并且强烈建议不要依赖它。根据预期的行为,needle 应该显式转换为字符串,或者应该显式调用 chr()

before_needle

如果为 true,则 strstr() 返回 haystackneedle 第一次出现之前(不包括 needle)的部分。

返回值

返回字符串的一部分,如果未找到 needle 则返回 false

变更日志

版本 描述
8.0.0 needle 现在接受空字符串。
8.0.0 不再支持将 int 作为 needle 传递。
7.3.0 int 作为 needle 传递已被弃用。

示例

示例 #1 strstr() 示例

<?php
$email
= '[email protected]';
$domain = strstr($email, '@');
echo
$domain; // 输出 @example.com

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

参见

  • stristr() - 不区分大小写的 strstr
  • strrchr() - 在字符串中查找字符的最后一次出现
  • strpos() - 在字符串中查找子字符串第一次出现的位置
  • strpbrk() - 在字符串中搜索一组字符中的任何一个
  • preg_match() - 执行正则表达式匹配

添加注释

用户贡献的注释 8 条注释

laszlo dot heredy at gmail dot com
11 年前
strstr() 不是避免使用 strpos() 进行类型检查的方法。

如果 $needle 是 $haystack 中的最后一个字符,并且单独测试 $needle 作为布尔值将计算为 false,那么测试 strstr() 作为布尔值将计算为 false(因为如果成功,strstr() 将返回 $needle 的第一次出现以及 $haystack 的其余部分)。

<?php
findZero
('01234'); // 找到零
findZero('43210'); // 未找到零
findZero('0'); // 未找到零
findZero('00'); // 找到零
findZero('000'); // 找到零
findZero('10'); // 未找到零
findZero('100'); // 找到零

function findZero($numberString) {
if (
strstr($numberString, '0')) {
echo
'找到零';
} else {
echo
'未找到零';
}
}
?>

此外,strstr() 比 strpos() 占用更多的内存,尤其是在使用更长的字符串作为 $haystack 时,因此,如果您对 strstr() 返回的子字符串不感兴趣,则无论如何都不应该使用它。

没有 PHP 函数仅用于检查 $needle 是否出现在 $haystack 中;strpos() 通过返回 false 来告诉您它是否_没有_出现,但是,如果它确实出现了,它会告诉您它_在哪里_出现,这是一个整数,如果 $needle 是 $haystack 的第一部分,则为 0(零),这就是为什么测试 if (strpos($needle, $haystack)===false) 是唯一确保知道 $needle 是否不是 $haystack 的一部分的方法。

我的建议是立即开始喜欢类型检查,并熟悉您正在使用的函数的返回值。

干杯。
Gevorg Melkumyan
3 年前
不要将此函数与 strtr 混淆)我在这上面浪费了大约 1 个小时
Julian Egelstaff
1 年前
注意旧代码中的逻辑反转!

在 PHP 8 中,如果 needle 是空字符串,则此函数将返回 0(而不是 false),这意味着字符串的第一个字符与 needle 匹配。在 PHP 8 之前,当 needle 为空字符串时,它将返回 false。

PHP 8 中还受到类似问题影响的其他字符串函数:strpos()、strrpos()、stripos()、strripos()、strchr()、strrchr()、stristr() 以及此函数 strstr()

如果您正在检查返回值是否 === false,那么您会被这种新行为误导。您还需要检查 needle 是否为空字符串。基本上,类似于以下内容

<?php
$result
= $needle ? strstr($haystack, $needle) : false;
?>
xslidian at lidian dot info
11 年前
对于需要字符串最后一次出现的人



<?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);
}
?>
[email protected]
13年前
已经使用多年了

<?php
/**
*
* @author : Dennis T Kaplan
*
* @version : 1.0
* Date : 2007年6月17日
* Function : 反转strstr()
* Purpose : 返回从起始位置到第一次出现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));
}
?>

您可以将其更改为
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php

function rstrstr($haystack,$needle, $start=0)
{
return
substr($haystack, $start,strpos($haystack, $needle));
}

?>
[email protected]
15年前
如果您想模拟5.3之前的strstr的新before_needle参数,strtok比使用strpos查找needle并使用substr切割更快。差异量因字符串大小而异,但strtok始终更快。
[email protected]
17年前
对于使用PHP 5.x或更低版本时的needle_before(第一次出现)参数,请尝试

<?php
$haystack
= 'php-homepage-20071125.png';
$needle = '-';
$result = substr($haystack, 0, strpos($haystack, $needle)); // $result = php
?>
[email protected]
9年前
> [email protected]

PHP 为您简化了此操作。在处理电子邮件地址的域名部分时,只需将 strstr() 的返回值传递给 substr() 并从 1 开始

substr(strstr($haystack, '@'), 1);
To Top