PHP字符串反转方法

PHP字符串反转方法

引言

字符串反转是面试和笔试高频小题,业务里也常用于生成验证码、翻转密文顺序、做简单加密。PHP内置strrev一行搞定,但处理中文时要注意字节和字符的区别。

英文字符反转:strrev

$str = "hello world";
echo strrev($str); // dlrow olleh

strrev按字节反转,英文和数字没有问题,性能也最高。

中文字符串反转

strrev直接转中文会乱码,因为中文UTF-8占3个字节,按字节切会把一个字拆坏。需要按字符处理:

$str = "技术分享";
$len = mb_strlen($str, 'UTF-8');
$result = '';
for ($i = $len - 1; $i >= 0; $i--) {
    $result .= mb_substr($str, $i, 1, 'UTF-8');
}
echo $result; // 享分术技

用mb_strlen取字符数,mb_substr按字符回取,保证每个完整汉字不被拆开。

数组方式实现

$arr = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
echo implode('', array_reverse($arr));

u修饰符按UTF-8切字符成数组,array_reverse翻转后再拼回去。

随机打乱:str_shuffle

echo str_shuffle("abc123"); // 每次结果随机

注意str_shuffle同样按字节,中文打乱不适用,验证码里建议只放英文数字。

注意事项

  • strrev只适合单字节英文,中文必须走mb系列;
  • 生产验证码用str_shuffle后再截取长度,别用中文;
  • 反转不等于加密,明文可还原,别拿来做真正加密;
  • mb扩展缺失时先检查extension_loaded('mbstring');
  • 超大字符串循环回拼建议用数组收集后implode,减少字符串反复复制。

总结

英文用strrev一行反转,中文用mb_strlen加mb_substr按字符倒取,数组preg_split配合array_reverse也能实现,随机打乱用str_shuffle但仅限英文数字。记住字节反转和字符反转的区别,中文场景务必走mb扩展,大字符串用数组收集再拼接提升性能。


emer 发布于  2026-10-20 07:05 

PHP字符串截取方法

PHP字符串截取方法

引言

截取标题摘要、手机号中间脱敏、按字数截断列表页,是PHP开发里最高频的操作。很多人直接用substr处理中文,结果出现半个汉字的乱码,关键在于substr按字节切,中文UTF-8占3个字节。

substr按字节截取

$str = "hello世界";
echo substr($str, 0, 5); // 输出 hello,中文场景容易切坏

substr只适合纯英文ASCII,遇到中文按字节偏移,可能把一个汉字拆成两半。

mb_substr按字符截取

处理中文要用多字节扩展mbstring:

echo mb_substr("hello世界", 0, 5, 'UTF-8');

第四个参数指定编码UTF-8,按"字"而不是"字节"切,中文完整不烂。

带省略号的摘要截断

function cutText($text, $len = 20) {
    if (mb_strlen($text, 'UTF-8') <= $len) return $text;
    return mb_substr($text, 0, $len, 'UTF-8') . '...';
}

先mb_strlen算字符长度,超长再截并补省略号,列表页摘要常用。

手机号中间脱敏

$phone = "13812345678";
echo substr($phone, 0, 3) . '****' . substr($phone, -4);
// 138****5678

手机号纯数字,substr完全够用,用-4取后四位。

注意事项

  • 中文必须mb_substr并显式传UTF-8,别依赖默认编码;
  • 确认服务器装了mbstring扩展,php -m查看;
  • 表情、生僻字占多个字节,更要按字符切;
  • 截断前先判断长度,避免补省略号反而超长。

总结

纯英文数字用substr,含中文统一mb_substr指定UTF-8,摘要先mb_strlen判断再补省略号,手机号脱敏用substr取头尾。选对函数就不会出现半个汉字乱码。


emer 发布于  2026-10-19 07:16