PHP中判断字符串包含子串的方法:strstr与strpos详解

沈亦白
沈亦白
发布时间:2026-10-16| 6人浏览过
原创

在PHP开发中,经常需要判断一个字符串是否包含特定的子字符串。本文将详细解析strstr和strpos这两个常用函数的使用方法、返回值差异以及正确的使用姿势,帮助您避免常见的逻辑错误。

strstr 函数的定义与用法

strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点开始)。如果未找到所搜索的字符串,则返回 false。

第1步:基本语法参数

语法结构如下:

strstr(string, search, before_search)
  • string:必需。规定被搜索的字符串。
  • search:必需。规定所搜索的字符串。如果此参数是数字,则搜索匹配此数字对应的 ASCII 值的字符。
  • before_search:可选。默认值为 false 的布尔值。如果设置为 true,它将返回 search 参数第一次出现之前的字符串部分(自 PHP 5.3.0 起可用)。

实战操作示例

第2步:执行常规字符串匹配

这是最常见的用法,用于提取目标字符串及其后面的所有内容。

<?php
echo strstr("Hello world!", "world");
// 输出:world! ?>

当搜索字母 o(ASCII 值为 111)时:

<?php
echo strstr("Hello world!", 111);
// 输出:o world! ?>

第3步:获取匹配点之前的内容

利用第三个参数 before_search 可以截取匹配前的片段,常用于提取邮箱用户名或域名等场景。

<?php
$email = 'admin@example.com'; 
$user = strstr($email, '@', true); // 注意第三个参数为 true
echo $user; // 输出:admin 

$domain = strstr($email, '@'); 
echo $domain; // 输出:@example.com ?>

第4步:处理多关键字匹配场景

如果有多个相同的关键词,strstr 会在遇到第一个停止。

<?php
// 即使前面有相似字符,也会完整匹配 'box'
echo strstr('aaaaboxcccccccccbcccccccccccccc','box')."<br>\n";
// 两个 'box' 时,到第一个为止停止
echo strstr('aaaaaaAbaaa aaaa aaaaaaaaaboxccccccccccccboxccccccccccc','box')."<br>\n";
// 搜索 'to'
echo strstr('Subscrtibe our to free newsletter about New Freew to','to')."<br>\n";
?>

最佳实践:判断字符串包含关系的正确姿势

虽然 strstr 可以用于判断,但在仅需要“判断是否存在”而非“提取结果”的场景下,strpos() 通常是更高效的选择。许多开发者容易陷入类型判断的陷阱,下面详细说明如何正确使用。

第5步:使用 strpos 进行严格判断

strpos() 返回子串首次出现的整数位置(从 0 开始),如果没找到则返回 false。

核心注意点: 如果子串位于字符串的开始位置(索引为 0),strpos 会返回整数 0。在 PHP 的弱类型比较中,0 被视为 false,但事实上它代表找到了!因此,必须使用 恒等运算符(!== 或 ===)来区分整数 0 和 boolean false。

<?php
$string = "ITBDW is great";
$needle = "IT";

// 错误示范:if (strpos($string, $needle)) { ... }
// 当 needle 在开头时,返回 0,被解释为 false,导致逻辑错误

// 正确做法:检查严格不等于 false
if (strpos($string, $needle) !== false) {
    echo "包含 IT!";
}

/**
* 封装为一个实用的辅助函数
*/
function isInString($haystack, $needle) {
    return false !== strpos($haystack, $needle);
}

$test_haystack = 'I am ITBDW';
var_dump(isInString($test_haystack, 'IT')); // 输出 bool(true)
?>

总结与其他替代方案

  • explode:可以将字符串分割后判断数组长度是否大于 1,适用于简单的存在性检查。
  • 正则表达式 preg_match:功能强大,但如果 $needle 中包含特殊字符需转义,且性能相对较慢,不建议仅做简单查找时使用。
  • stristr:用法与 strstr 完全相同,但不区分大小写。例如搜索 "World" 也能匹配到 "hello world"。

综上所述,对于大多数仅需判断存在的场景,推荐直接使用 strpos($haystack, $needle) !== false 这种写法,既高效又不易出错。

以上就是PHP中使用strstr和strpos查找字符串的详细内容和技巧,更多关于PHP字符串操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。