PHP利用中英文字符长度差异识别混合垃圾评论
在使用内容管理系统时,常遇到一种特殊的垃圾评论:攻击者在长段英文中故意插入一两个生僻汉字,以此绕过基于关键词匹配的过滤机制,且这些汉字本身不违规。由于常规正则或黑名单难以覆盖,可改用计算“中文字符占比”的策略进行拦截。若文章核心为中文但中文占比过低,则极大概率为机器生成的干扰性评论。
实现原理:字符编码长度差异
该方案的核心在于利用 PHP 字符串处理函数对中文和英文字符的不同处理方式。在常见的 UTF-8 编码环境下:
strlen()获取字符串的物理字节长度。对于 ASCII 字符(英文、数字),占用 1 个字节;对于大多数常用汉字,通常占用 3 个字节。mb_strlen()获取字符串的字符数量。无论是英文还是汉字,均计为 1 个字符。
基于上述差异,可以通过两者之差推算出汉字的实际数量,进而计算中文在全文中的比例。
具体操作步骤
第1步:获取物理字节与逻辑字符长度
首先,提取待检测的评论内容,分别计算其字节长度和字符个数。确保 mb_strlen 指定正确的编码格式(通常为 'UTF-8')。
$comment_text = $comment['text'];
// 获取字节长度(汉字按3字节计)
$len_bytes = strlen($comment_text);
// 获取字符数量(汉字按1字符计)
$len_chars = mb_strlen($comment_text, 'UTF-8');
第2步:计算中文占比
根据数学推导:
总字节数 ≈ (英文字符数 × 1) + (中文字符数 × 3)
总字符数 = 英文字符数 + 中文字符数
由此可得:中文字符数 = (总字节数 - 总字符数) / 2
将计算出的中文字符数除以总字符数,即为中文占比。以下为完整的判断逻辑实现:
// 假设中文字符数为 0 的情况需单独处理避免除零错误
if ($len_chars > 0) {
// 计算中文所占比例
$chinese_ratio = ($len_bytes - $len_chars) / (2 * $len_chars);
// 设定阈值:若中文占比低于 0.5 (50%),则判定为可疑垃圾评论
if ($chinese_ratio < 0.5) {
return "检测到异常评论:中文内容过少,疑似垃圾信息";
}
} else {
// 如果字符数为0,视为空评论
return "评论内容不能为空";
}
第3步:处理含代码块的复杂场景
上述逻辑默认应用于纯文本语境。但在技术论坛或允许贴代码的平台,用户 legitimately(合法地)发布包含大量英文代码和注释的帖子时,中文占比可能极低。
为避免误杀,建议在计算比率前,先将代码块(如 <code>、<pre> 标签内的内容)剔除,仅对用户输入的正文段落进行比率分析。
完成判断与排错
判定标准:当返回“中文占比低于阈值”的错误提示时,系统应拦截该提交或标记为人工审核状态。
注意事项:
1. 编码一致性:务必确认数据库存储和页面输出的编码均为 UTF-8,否则 mb_strlen 可能产生乱码或计算错误。
2. 特殊字符:部分 Emoji 或生僻字在 UTF-8 下可能占用 4 个字节,这会轻微影响精度,但对于防御通用垃圾评论已足够有效。
3. 业务适配:50% 仅为参考值。若是英文为主的技术博客,可适当降低阈值;若是纯中文资讯站,可提高至 60%-70%。
总结
利用 strlen 和 mb_strlen 的长度差来过滤垃圾评论,是一种轻量级且高效的手段。它专门针对“中英混杂”的反人类垃圾策略,无需引入复杂的机器学习模型即可显著提升评论质量。以上就是利用PHP中文字符比率判断垃圾评论的详细内容,更多关于PHP过滤技术优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













