strrev()适用于ASCII/UTF-8单字节字符,含中文等多字节字符需自定义mb_strrev(),注意编码设置、边界处理及空值判断。

PHP 里直接反转字符串用 strrev()
绝大多数情况,strrev() 就是你要的答案。它接收一个字符串,返回完全倒序的新字符串,不修改原变量,也不管编码——但正因如此,它只安全用于 ASCII 或 UTF-8 单字节字符(比如纯英文、数字、符号)。一旦字符串含中文、日文、emoji 等多字节字符,strrev() 会把每个字节单独翻转,导致乱码。
含中文的字符串反转必须用 mb_strrev()(需自己补)
PHP 标准库没有内置 mb_strrev(),得手动实现。核心思路是:用 mb_substr() 按字符(不是字节)逐个截取,再倒序拼接。注意三点:
-
mb_internal_encoding()必须提前设为'UTF-8',否则mb_*函数可能行为异常 - 循环起始位置是
mb_strlen($s) - 1,结束条件是$i >= 0,别漏掉第 0 个字符 - 别用
for ($i = mb_strlen($s); $i >= 0; $i--),这样会多取一次空字符
简短示例:
function mb_strrev($s) {
$len = mb_strlen($s);
$rev = '';
for ($i = $len - 1; $i >= 0; $i--) {
$rev .= mb_substr($s, $i, 1);
}
return $rev;
}性能敏感场景慎用 mb_substr() 循环
对超长 UTF-8 字符串(比如几万字符的文本),上面的循环 + mb_substr() 组合会明显变慢——因为每次调用 mb_substr() 都要重新扫描编码边界。替代方案是先用 preg_split('//u', $s, -1, PREG_SPLIT_NO_EMPTY) 拆成字符数组,再 array_reverse(),最后 implode()。但注意:preg_split() 开销也不小,且正则在极端短字符串下反而更重。真实项目中建议先测数据长度和频率,别一上来就优化。
立即学习“PHP免费学习笔记(深入)”;
别忽略空字符串和 null 的边界情况
strrev(null) 返回 ''(空字符串),strrev('') 也返回 '';但 mb_strlen(null) 触发警告,mb_substr(null, 0, 1) 返回 false。所以自定义 mb_strrev() 一定要加判空:
- 开头检查
if ($s === null || $s === '') return $s; - 避免把
NULL当字符串传进去,尤其从数据库或 API 取值时 - 如果输入可能为整数(如
123),strrev(123)会先转成字符串再翻,但mb_strrev(123)会失败——显式(string)$s更稳妥
多字节反转真正麻烦的从来不是函数怎么写,而是你根本没意识到当前字符串到底是不是 UTF-8 编码,或者来源数据是否混了 BOM、控制字符、代理对……这些地方一错,翻转结果看着像对了,其实已经损毁。











