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扩展,大字符串用数组收集再拼接提升性能。
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取头尾。选对函数就不会出现半个汉字乱码。