查找字符串中关键词首次出现位置应使用 strpos()(单字节)或 mb_strpos()(utf-8 多字节),二者均返回起始偏移量且需用 !== false 判断;不区分大小写时选 stripos() 或 mb_stripos();正则仅适用于复杂模式匹配。

用 str_contains() 只能判断是否存在,不能定位位置;PHP 8.3 推荐用 str_starts_with()、str_ends_with() 做前缀/后缀判断,但找“第一次出现的位置”,核心函数仍是 strpos() —— 它在 PHP 8.3 中完全兼容且性能稳定。
用 strpos() 获取首次匹配的字节偏移量
strpos() 是最直接、最高效的方式,返回关键词第一次出现的起始位置(从 0 开始计数),未找到返回 false。注意它区分大小写:
-
必须用
!== false判断结果(因为位置可能是 0,而== false会误判) - 第三个参数可指定搜索起始位置,实现跳过开头的查找
- 对多字节字符(如中文)不安全,若字符串含 UTF-8 中文,需改用
mb_strpos()
示例:
$text = "PHP 8.3 新增了 str_contains,但找位置还得用 strpos";
$pos = strpos($text, "8.3");
if ($pos !== false) {
echo "首次出现在第 $pos 个字节"; // 输出:首次出现在第 4 个字节
}
处理中文或 Unicode 字符时用 mb_strpos()
如果字符串含中文、日文等 UTF-8 多字节字符,strpos() 按字节计算会出错(比如把一个中文拆成两半)。此时必须用 mb_strpos(),并显式指定编码:
- 第二个参数是关键词,第三个是起始位置(可选),第四个是编码,推荐
'UTF-8' - 返回的是字符位置(非字节),更符合直觉
- 确保
mbstring扩展已启用(PHP 8.3 默认开启)
示例:
$text = "欢迎使用 PHP 8.3";
$pos = mb_strpos($text, "PHP", 0, 'UTF-8');
if ($pos !== false) {
echo "首次出现在第 $pos 个字符"; // 输出:首次出现在第 4 个字符
}
想忽略大小写?用 stripos() 或 mb_stripos()
当需要不区分大小写搜索(如查 "php" 在 "PHP 8.3" 中的位置),用 stripos()(单字节)或 mb_stripos()(多字节):
- 行为与对应函数一致,只是忽略大小写
- 同样要严格用
!== false判断 - UTF-8 场景下优先选
mb_stripos(),避免乱码和越界
示例:
$text = "Php 8.3 和 php 内核";
$pos = mb_stripos($text, "php", 0, 'UTF-8'); // 返回 0
if ($pos !== false) {
echo "首次不区分大小写出现在第 $pos 个字符";
}
不建议用正则(preg_match())只找位置
虽然 preg_match('/keyword/', $text, $matches, PREG_OFFSET_CAPTURE) 能拿到位置,但明显重了:
- 启动正则引擎开销大,纯文本搜索没必要
- 语法复杂,易引入转义错误(比如关键词含
.、*) -
strpos()系列函数底层高度优化,速度通常快 3–10 倍
除非你要同时做复杂模式匹配(如“以 a 开头、含数字、结尾是 x”),否则别为单纯找位置上正则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











