PHP截取字符串到指定字符首选strstr($str, $char, true),其次用mb_strpos()+mb_substr()处理多字节字符,需注意strpos()返回值必须用!== false判断。

PHP 中截取字符串到指定字符,常用方法是结合 strpos() 获取位置,再用 substr() 截取。核心思路:先找目标字符首次出现的位置,然后从开头截取到该位置(不含目标字符)。
基础写法:截取到第一个指定字符前
比如字符串 "name=张三&age=25",想截取 "name=张三"(即到第一个 & 之前):
$str = "name=张三&age=25"; $pos = strpos($str, '&'); $result = $pos !== false ? substr($str, 0, $pos) : $str; // 结果:'name=张三'
注意:必须判断 strpos() 返回值是否为 false,因为没找到时返回 false,而 0 是合法位置(首字符匹配),不能用 == 或隐式判断。
截取到第 N 次出现的字符前
原生 strpos() 不支持直接找第 N 次,需循环调用或改用 mb_strpos()(多字节安全)配合偏移量:
- 用
strpos($str, $char, $offset)多次查找 - 或用
explode()简单分隔(适合分隔符明确、不需保留空段的场景)
示例:取第二个 / 前的部分(如 /home/user/docs/file.txt → /home/user):
$str = "/home/user/docs/file.txt";
$pos1 = strpos($str, '/');
if ($pos1 !== false) {
$pos2 = strpos($str, '/', $pos1 + 1);
if ($pos2 !== false) {
$pos3 = strpos($str, '/', $pos2 + 1);
$result = $pos3 !== false ? substr($str, 0, $pos3) : $str;
}
}
处理中文或特殊编码时的注意事项
如果字符串含中文、emoji 或 UTF-8 多字节字符,strpos() 和 substr() 可能出错(它们按字节操作,非字符):
- 优先使用
mb_strpos()和mb_substr(),并指定编码(如'UTF-8') - 例如:
$pos = mb_strpos($str, '关键词', 0, 'UTF-8'); - 避免用
strlen()判断长度,改用mb_strlen()
更简洁的替代方案(按需选用)
不是所有场景都必须手动找位置:
-
strstr($str, $char, true):PHP 5.3+ 支持第三个参数true,直接返回查找字符前的部分(自动处理未找到情况) -
strtok($str, $char):按分隔符切出第一段(仅适用于简单单字符分隔) -
explode($char, $str)[0]:快速取第一段,但要注意空数组风险
推荐首选 strstr($str, $char, true),代码短且语义清晰:
$str = "abc,def,ghi"; $result = strstr($str, ',', true); // 'abc'
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











