php字符串操作需以utf-8为前提,优先使用mb_*函数;str_replace()需赋值接收返回值;strpos()等判断必须用!==;trim()可自定义字符集。

别从“字符串是什么”开始学,直接进坑再爬出来最快。PHP字符串函数不是靠背的,是靠在具体问题里试错、比对行为差异才真正掌握的。
substr() 和 mb_substr() 到底该用哪个?
不是“中文用 mb_substr(),英文用 substr()”这么简单。关键看数据来源是否可控:用户输入、数据库读取、API返回,几乎全是 UTF-8 编码——哪怕全是英文字母,也可能混入 emoji 或零宽空格。substr() 按字节切,mb_substr() 才按字符切。
-
substr("a?b", 1, 2)返回乱码"b",因为?占 4 字节,它从第 2 字节开始取 2 字节,刚好切在中间 -
mb_substr("a?b", 1, 2, 'UTF-8')返回"?b",正确 - 只有当你 100% 确定字符串是纯 ASCII(比如生成的 token、base64、十六进制串),才用
substr()——更快,且不依赖mbstring扩展
str_replace() 不生效?大概率没接返回值
str_replace() 不修改原变量,而是返回新字符串。这是最常被忽略的点。
- 错误写法:
str_replace("old", "new", $text); echo $text;→ 输出还是原内容 - 正确写法:
$text = str_replace("old", "new", $text); - 想替换大小写不敏感?别自己先
strtolower()再查,直接用str_ireplace() - 批量替换时,
$search和$replace两个数组长度必须一致;否则多出的$replace元素被忽略,少掉的则替换成空字符串 - 要统计替换次数?传第 4 个引用参数:
str_replace("x", "y", $s, $count);,之后$count就是整数
strpos() 返回 0 还是 false?判断必须用 !==
strpos() 找到在开头就返回 0,没找到返回 false。用 == 判断会出事:0 == false 是 true,逻辑全崩。
- 必须用严格比较:
if (strpos($text, "abc") !== false) { } - 找最后一次出现的位置?用
strrpos(),行为一致,同样要!== false - 不区分大小写查找?换
stripos(),别自己先strtolower()——性能差,还可能破坏原始大小写结构
trim() 只能去空格?你低估它了
trim() 默认只去 ASCII 空白符(\t\n\r\0\x0B),但你可以指定任意字符集。处理脏数据时特别有用。
- 清理带全角空格、中文顿号、甚至 BOM 头的用户粘贴内容:
trim($text, " \t\n\r\0\x0B\u{3000}")(\u{3000}是 Unicode 全角空格) - 只去左边?用
ltrim();只去右边?用rtrim() - 编码参数不可省略:如果传了字符集,
mb_trim()并不存在,必须搭配mbstring函数手动实现,或确保整个流程统一用mb_*系列
多字节安全不是可选项,是默认前提。只要涉及用户输入、数据库、HTTP 请求,就默认它是 UTF-8,mb_* 函数该上就得上,别等乱码出来了再回头改。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











