strrev()是PHP内置字符串反转函数,用于颠倒ASCII/GBK字符串,但不支持UTF-8中文;常用于验证码视觉混淆,校验时需双向反转匹配,中文场景应改用mb_substr或preg_split配合array_reverse。

strrev() 是 PHP 内置的字符串反转函数,它接收一个字符串作为参数,返回该字符串中所有字符顺序完全颠倒后的新字符串。这个函数简单高效,常用于验证码混淆、简易加密、回文判断等场景,尤其在生成视觉干扰型验证码时非常实用。
strrev() 基本用法与注意事项
语法很简单:strrev($string),其中 $string 必须是字符串类型,否则会触发警告或返回空结果。
- 只支持单字节编码(如 ASCII、GBK),对 UTF-8 多字节中文直接使用会导致乱码——例如 strrev("你好") 可能输出类似 "好你" 的错误结果;
- 空字符串或 null 输入会返回空字符串,不会报错;
- 数字会被自动转为字符串处理,比如 strrev(123) 返回 "321";
- 不修改原字符串,始终返回新字符串,符合 PHP 字符串不可变特性。
验证码生成中 strrev() 的典型应用逻辑
在图形验证码中,strrev() 不用于“加密”,而是配合字体倾斜、字符重叠、背景噪点等手段增强 OCR 识别难度。常用思路是:先生成随机字符,再反转一次,让肉眼识别略带“错觉”,同时保持程序校验逻辑清晰。
- 原始验证码文本(如 "aB3x")→ 反转后显示("xB3a")→ 用户输入时按显示内容填写;
- 服务端校验时,对用户提交值再次反转,与原始值比对(即 strrev($_POST['code']) === $original);
- 也可反向设计:生成时就存反转后的值,显示原值,校验时再反转——关键在于前后一致,不暴露原始规律。
实战代码:带 strrev() 的简易验证码生成器
以下是一个可直接运行的命令行示例(也可嵌入 Web 脚本),生成 4 位字母+数字验证码,并用 strrev() 实现显示混淆:
立即学习“PHP免费学习笔记(深入)”;
<?php
// 1. 定义字符池
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$len = 4;
<p>// 2. 随机生成原始验证码
$original = '';
for ($i = 0; $i < $len; $i++) {
$original .= $chars[rand(0, strlen($chars) - 1)];
}</p><p>// 3. 反转用于显示(干扰视觉)
$display = strrev($original);</p><p>// 4. 模拟输出(实际项目中写入 session 或缓存)
$_SESSION['captcha_original'] = $original;
echo "【显示给用户的验证码】: $display\n";
echo "【服务端存储的原始值】: $original\n";</p><p>// 5. 模拟用户提交后校验(举例)
$user_input = $display; // 假设用户正确输入了显示的内容
if (strrev($user_input) === $original) {
echo "✅ 校验通过!\n";
} else {
echo "❌ 校验失败。\n";
}
?>UTF-8 中文验证码的替代方案
如果必须支持中文验证码,strrev() 就不能直接用了。推荐改用 mb_substr() + 循环拼接实现安全反转:
$str = "你好世界";
$reversed = '';
for ($i = mb_strlen($str, 'UTF-8') - 1; $i >= 0; $i--) {
$reversed .= mb_substr($str, $i, 1, 'UTF-8');
}
echo $reversed; // 输出:界世好你或者使用 preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY) 拆分后再 array_reverse(),更简洁可靠。



















