php截取指定字符后内容需先用strpos()定位再用substr(),utf-8下须用mb_substr()和mb_strpos(),explode()适合简单分隔,preg_match()更灵活健壮,strstr()默认含分隔符需配合substr()剔除。

PHP怎么用 substr() 截取指定字符之后的内容
直接用 substr() 不行——它只认位置,不认字符。得先用 strpos() 找到目标字符的位置,再算偏移量。
常见错误是写成 substr($str, 'keyword'),这会报 Warning:substr() 第二个参数必须是整数。
- 先用
strpos($str, $needle)找起始位置,注意返回false表示没找到,不能直接加 1 - 安全写法:用三元判断,比如
$pos = strpos($str, ':') !== false ? strpos($str, ':') + 1 : 0; - 然后传给
substr($str, $pos),就能拿到冒号后面所有内容 - 如果目标字符可能重复(如 URL 中的
/),用strrpos()取最后一次出现的位置更稳妥
遇到中文或 UTF-8 字符串时为什么 substr() 截乱了
因为 substr() 是按字节操作的,而 UTF-8 中一个中文占 3 字节。substr($str, 0, 5) 可能切在某个汉字中间,输出乱码或截断失败。
正确做法是换用多字节函数:mb_substr(),并显式指定编码:
立即学习“PHP免费学习笔记(深入)”;
- 确保 PHP 启用了
mbstring扩展(大多数环境默认开启) - 写成
mb_substr($str, $start, $length, 'UTF-8'),长度和起始都按字符数算 - 找位置也要配套用
mb_strpos($str, $needle, 0, 'UTF-8') - 别依赖
ini_set('mbstring.func_overload', 1),它不可靠,且已被弃用
explode() 和 preg_match() 哪个更适合“截取指定字符之后”
看场景:简单分隔用 explode() 最快;带条件、边界模糊或要提取多个片段时,preg_match() 更稳。
-
explode(':', $str)[1] ?? ''快,但只适用于严格单一分隔符,且数组下标越界会 Notice -
preg_match('/:(.*)/', $str, $matches); $result = $matches[1] ?? '';更健壮,支持懒匹配、排除换行等 - 性能上,
explode()比正则快 3–5 倍,但差别在微秒级,除非高频调用否则不用纠结 - 如果分隔符本身是正则元字符(如
.、*),用explode()更省心,避免转义麻烦
为什么 strstr() 返回结果比预期多一截
strstr($str, ':') 返回的是从第一个 : 开始到结尾的**整个子串**,包括那个冒号本身。很多人想要的是“之后”,结果白留了个前缀。
解决方法很简单:加第三个参数 true,让它返回“之前”的部分;加 false(默认)才返回“之后”,但含分隔符。
- 要“之后且不含分隔符”,用
substr(strstr($str, ':'), 1) - 或者更清晰:用
strtok($str, ':')拿第一段,再调一次strtok(':')拿第二段(适合单次分割) -
strstr()对大小写敏感,需要忽略时用stristr() - 它不支持多字节安全,中文场景仍得回退到
mb_strstr()











