应使用 mb_substr() 处理 utf-8 中文,避免 substr() 截断乱码;批量替换优先 str_replace();拼接字符串用数组+implode();php 8.0+ 用 str_starts_with()/str_ends_with() 判断首尾。

用对函数,别让 substr() 处理中文
UTF-8 下中文是多字节字符,substr() 按字节截取,直接切在中间就会出乱码。比如 substr("你好世界", 0, 3) 可能返回 "你" —— 因为“你”占3个字节,第3字节被截断。
真正安全的做法是:涉及中文、日文等多字节文本时,一律用 mb_substr(),并显式传入编码:
-
mb_substr("你好世界", 0, 2, 'UTF-8')→"你好" - 确保 PHP 已启用
mbstring扩展,否则会报Call to undefined function mb_substr() - 如果不确定编码,优先设为
'UTF-8';历史遗留 GBK 场景才考虑'GBK'
批量替换优先用 str_replace(),不是 preg_replace()
正则引擎开销大,只要不依赖模式匹配(比如“所有以 a 开头的单词”),就别用 preg_replace()。90% 的关键词替换场景,str_replace() 更快、更直观、更少出错。
常见误用:
- 把
str_replace([''], [''], $html)写成preg_replace(['/]+>/'], '', $html)—— 这是 XSS 过滤,不是简单替换 - 想统计替换次数?传第4个参数:
str_replace('a', 'x', 'banana', $count),之后$count是3 - 数组批量替换时,键值顺序必须严格对应,否则结果错位
拼接大量字符串时,别用 .= 循环
每次 .= 都可能触发内存重分配,1000 次拼接实际性能可能比预期差 3–5 倍。PHP 底层对数组 + implode() 做了高度优化。
正确姿势:
- 收集片段进数组:
$parts[] = $item; - 最后一次性拼接:
$result = implode('', $parts); - 若需分隔符(如换行),直接塞进
implode("\n", $parts) - PHP 8.2+ 不支持
+拼接字符串 —— 那是谣言,+是算术运算符,用它拼接会转成数字再相加,导致静默错误
判断开头/结尾,用 str_starts_with() 和 str_ends_with()
PHP 8.0+ 原生提供了这两个函数,比手写 substr($s, 0, 5) === 'prefix' 或正则更简洁、更安全。它们底层做了短路和长度预检,性能也更好。
注意点:
- 只支持 PHP ≥ 8.0;低于该版本必须自己封装或用
strncmp() - 参数顺序是
str_starts_with($haystack, $needle),别把两个字符串位置写反 - 它们不支持空字符串作为
$needle(会返回false),这点和部分自定义实现不同
最常被忽略的是编码一致性:strlen() 和 mb_strlen() 的结果差异,会连带影响 substr()、strpos()、strrpos() 的偏移计算。一个函数选错,整条处理链就偏了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











