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

如果为 truestrstr() 将返回 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() - 执行正则表达式匹配

添加备注

用户贡献的备注 10 个备注

laszlo dot heredy at gmail dot com
10 年前
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() 返回的子字符串不感兴趣,就不应该使用它。

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

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

干杯。
Gevorg Melkumyan
3 年前
不要将此函数与 strtr 混淆 ) 我在上面浪费了 1 个小时
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);
}
?>
Julian Egelstaff
1 年前
注意旧代码中的逻辑反转!

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

在 PHP 8 中,其他受到类似问题影响的字符串函数包括:`strpos()`、`strrpos()`、`stripos()`、`strripos()`、`strchr()`、`strrchr()`、`strstr()` 和 `stristr()`。

如果你正在检查返回值是否 === false,那么你会被这种新的行为误导。你也要检查 `needle` 是否是空字符串。基本上,像这样

<?php
$result
= $needle ? strstr($haystack, $needle) : false;
?>
gruessle at gmail dot com
13 年前
多年来一直在使用这个

<?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));
}
?>

你可以把它改成
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php

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

?>
w3b_monk3y at yahoo dot com
15 年前
如果你想模拟 strstr 在 5.3 之前的 `before_needle` 参数,`strtok` 比使用 `strpos` 查找 `needle` 并用 `substr` 剪切更快。差异的大小取决于字符串的大小,但 `strtok` 始终更快。
brett dot jr dot alton at gmail dot com
16 年前
对于使用 PHP 5.x 或更低版本时的 `needle_before`(第一次出现)参数,请尝试

<?php
$haystack
= 'php-homepage-20071125.png';
$needle = '-';
$result = substr($haystack, 0, strpos($haystack, $needle)); // $result = php
?>
trent dot renshaw at objectst dot com dot au
9 年前
> root at mantoru dot de

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

substr(strstr($haystack, '@'), 1);
root at mantoru dot de
16 年前
请注意,`$needle` 包含在返回值字符串中,如上面的示例所示。这并不总是期望的行为,_尤其_是在上面提到的示例中。如果你想要 `$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 = '[email protected]';
$domain = strstr_after($email, '@');
echo
$domain; // prints example.com
?>
leo dot nard at free dot fr
19 年前
在将 ASCII 字符串编码为 HTML 大小受限的字符串时,有时某些 HTML 特殊字符会被截断。

例如,将 "��" 编码为大小为 10 的字符串时,你会得到:"à&a" => 第二个字符被截断。

这个函数将从字符串中删除任何未完成的 HTML 特殊字符...

<?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