php字符串函数需在实战中掌握:substr()按字节切,mb_substr()按字符切(utf-8必用);str_replace()不修改原变量,需赋值接收;strpos()必须用!== false判断;trim()可自定义清理字符集,且编码参数不可省略。

substr() 和 mb_substr() 什么时候必须二选一?
不是“中文用 mb_substr(),英文用 substr()”这么简单。关键看你的数据来源是否可控:用户输入、数据库读取、API返回,几乎全是 UTF-8 编码,哪怕里面全是英文字母,也可能混入 emoji 或零宽空格——substr() 会按字节切,mb_substr() 才按字符切。
-
substr("a?b", 1, 2)返回乱码(b),因为 ? 占 4 字节,substr()从第 2 字节开始取 2 字节,刚好切在中间 -
mb_substr("a?b", 1, 2, 'UTF-8')返回"?b",正确 - 如果确定字符串 100% 是 ASCII(比如生成的 token、base64、十六进制字符串),
substr()更快,且无需启用mbstring扩展
str_replace() 为什么有时不生效?
最常见原因是没处理返回值——str_replace() 不修改原变量,而是返回新字符串。另一个高发坑是大小写误判,比如想替换 "Apple",但原文是 "apple" 或 "APPLE",这时得换 str_ireplace()。
- 错误写法:
str_replace("old", "new", $text); echo $text;→ 输出还是原内容 - 正确写法:
$text = str_replace("old", "new", $text); - 批量替换时,两个数组长度必须一致,否则多出的
$replace元素会被忽略,少掉的则替换成空字符串 - 想统计替换次数?传第 4 个引用参数:
str_replace("x", "y", $s, $count);,之后$count就是整数
strpos() 返回 false 还是 0?怎么安全判断?
strpos() 找到在开头就返回 0,没找到返回 false。用 == 判断会出事:0 == false 是 true,逻辑全崩。
- 必须用严格比较:
if (strpos($text, "abc") !== false) { ... } - 如果要找最后一次出现的位置,用
strrpos(),行为一致,同样要!== false - 不区分大小写?换
stripos(),别自己先strtolower()再查——性能差、还可能破坏原始大小写结构
trim() 只能去空格?
默认是去 ASCII 空白符(\t\n\r\0\x0B),但你可以指定任意字符集。比如清理用户粘贴进来的带全角空格、中文顿号、甚至 BOM 头的脏数据。
-
trim($text, " \t\n\r\0\x0B\u{3000}")—— 加上 Unicode 全角空格(U+3000) -
trim($text, ",。!?;:""'`()【】《》")—— 清理中文标点包围 -
ltrim($text, "\xEF\xBB\xBF")—— 去掉 UTF-8 BOM(三个字节) - 注意:
trim()不处理字符串中间的字符,要删中间得用str_replace()或正则
mb_strlen() 和 mb_substr() 必须配对使用,且编码参数(如 'UTF-8')不能漏——缺了它,函数可能 fallback 到内部默认编码,而那个默认值在不同服务器上可能不一样。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











