str_replace需注意大小写敏感、不支持正则、返回值类型不稳定;忽略大小写用str_ireplace,模式替换用preg_replace,批量映射用关联数组传参,且必须赋值接收结果。

str_replace 怎么用才不踩空数组或大小写陷阱
str_replace 是最常被拿来就用的函数,但实际中容易忽略它对大小写敏感、不支持正则、且返回值类型不稳定这三点。比如替换后结果为空字符串,str_replace 仍返回原字符串(不是 null 或 false),若后续用 empty() 判断可能误判。
常见错误现象:str_replace(['a', 'b'], '', 'abc') 得到 'c',但若传入 null 或非数组的 $search,会直接警告“Invalid arguments”;另外,它不会修改原字符串,必须赋值接收。
- 大小写敏感 → 需要忽略大小写时改用
str_ireplace - 想按模式替换(如所有数字、邮箱)→ 不能硬套
str_replace,得换preg_replace - 批量替换键值映射更清晰 → 用关联数组:
str_replace(array_keys($map), array_values($map), $text) - 性能注意:在超长文本里反复调用
str_replace比单次preg_replace更快,但正则更灵活
substr 和 mb_substr 的区别不是“多字节”,而是编码感知方式
中文、日文、emoji 场景下,substr 经常截出乱码,根本原因不是“它不支持中文”,而是它按字节切,而 UTF-8 中一个汉字占 3 字节。比如 substr('你好', 0, 2) 可能只取前 2 字节,得到非法 UTF-8 序列。
mb_substr 的关键参数是 $encoding,不显式传 'UTF-8' 时依赖 mb_internal_encoding() 当前设置,线上环境经常不一致,导致本地正常、生产乱码。
立即学习“PHP免费学习笔记(深入)”;
- 务必显式指定编码:
mb_substr($str, 0, 10, 'UTF-8') - 获取长度也得用
mb_strlen($str, 'UTF-8'),别混用strlen - 如果确定全是 ASCII(如 token、base64),
substr更快,不用强制切mb_* - PHP 8.0+ 支持
str_split的第三个参数指定编码,但substr始终不支持 —— 别指望它“自动适配”
trim / ltrim / rtrim 的“字符集合”不是子串,是逐字符匹配
很多人以为 trim('xxhelloxx', 'xx') 会去掉首尾的 'xx',结果得到 'helloxx'。因为 trim 第二个参数是字符列表,不是字符串,等价于“把首尾出现的 'x' 全删掉”,所以 'xxhelloxx' → 'hello' 才对;而 'abccba' 用 trim($s, 'ab') 会删光首尾所有 a 和 b,剩下 'cc'。
常见错误场景:清理用户输入的昵称,想删掉首尾空格和中文全角空格(\u3000),却只写 trim($name, " \t\n\r\0\x0B\u3000") —— 但 \u3000 是 Unicode 字符,双引号里不会解析,得用 " \t\n\r\0\x0B\xE3\x80\x80" 或更稳妥的 mb_trim(需自己封装)。
- 安全做法:用
preg_replace('/^[\p{Zs}\s]+|[\p{Zs}\s]+$/u', '', $str)覆盖所有空格类字符 - 只想删空格和制表符 →
trim($str)默认就够,不用传参 - 删特定前缀(如
'prefix_')→ 不能靠ltrim,得用str_starts_with($str, 'prefix_') ? substr($str, 7) : $str(PHP 8.0+)或手动判断
json_encode 输出乱码或转义过多?检查 UTF-8 和 JSON_UNESCAPED_UNICODE
从数据库读出的中文字段用 json_encode 后变成 "\u4f60\u597d",不是 bug,是默认行为。PHP 把非 ASCII 字符转成 \uXXXX 是为了兼容性,但前端不需要这种转义,尤其做 API 返回时。
真正的问题常出在两处:一是源字符串本身不是合法 UTF-8(比如 GBK 编码的字符串直传进去),json_encode 会返回 false;二是没加标志位,导致斜杠、HTML 实体也被转义。
- 确保输入是 UTF-8:
mb_check_encoding($str, 'UTF-8') || false,否则先mb_convert_encoding($str, 'UTF-8', 'GBK') - 输出可读中文:
json_encode($data, JSON_UNESCAPED_UNICODE) - 避免 HTML 标签被转义:
JSON_UNESCAPED_SLASHES可选,但通常不需要 - 调试时用
json_last_error_msg()查具体失败原因,比看空字符串有用得多



















