敏感词过滤应优先用str_replace处理高频固定词,再对关键字段用preg_replace加\b和i修饰符精准匹配;词库需缓存避免重复加载;HTML内容须先strip_tags再过滤,最后htmlspecialchars防XSS;多字节字符串操作必须显式指定UTF-8编码。

敏感词过滤该用 str_replace 还是 preg_replace
直接用 str_replace 最快,但只能做简单替换,不支持模糊匹配、大小写无关或词边界控制;preg_replace 灵活,能加 \b 防止“苹果”误伤“苹果手机”里的“苹果”,但性能差、正则写错容易绕过。生产环境建议先用 str_replace 批量处理高频固定词,再对关键字段(如用户昵称、评论)用 preg_replace 加 i 和 \b 修饰符做精准过滤。
常见错误:直接 preg_replace('/苹果/', '*', $text) —— 会把“苹果手机”变成“*手机”;正确写法是 preg_replace('/\b苹果\b/i', '*', $text)。
敏感词库怎么加载才不拖慢页面
别每次请求都 file_get_contents('sensitive_words.json') 或查数据库。PHP-FPM 模式下,把词库读进 $_SERVER 或 APCu 缓存里,首次加载后复用;如果是 Swoole 或 PHP 8.1+,可存在 static 属性或 Swoole\Table 中。词库文件本身建议用 PHP 数组格式(sensitive_words.php),避免 JSON 解析开销。
- 小词库(return ['政治', '暴力', '色情']; +
include - 大词库(>5000 条):用 APCu 缓存,键名加版本号,比如
apcu_store('sensitive_words_v2', $words) - 绝对别在循环里反复
file()或json_decode()
用户提交的 HTML 内容怎么安全过滤敏感词
先剥离 HTML 标签再过滤,否则 政治 可能绕过。用 strip_tags() 最稳妥,别信正则去 HTML —— 正则根本解析不了嵌套或畸形标签。过滤完再重新渲染(如果必须保留格式),或直接转义输出。
立即学习“PHP免费学习笔记(深入)”;
关键顺序不能错:$plain = strip_tags($input); $filtered = filter_sensitive_words($plain); echo htmlspecialchars($filtered, ENT_QUOTES, 'UTF-8');。漏掉 htmlspecialchars 就可能引发 XSS。
Angel工作室企业网站管理系统全DIV+CSS模板,中英文显示,防注入sql关键字过滤,多浏览器适应,完美兼容IE6-IE8,火狐,谷歌等符合标准的浏览器,模板样式集中在一个CSS样式中,内容与样式完全分离,方便网站设计人员开发模板与管理。系统较为安全,以设计防注入,敏感字符屏蔽。新闻,产品,单页独立关键字设计,提高搜索引擎收录。内置IIS测试,双击打启动预览网站 Angel工作室企业网站
注意:strip_tags() 默认不过滤自闭合标签如 ,如需更严格,配合 html5lib 或 DOMDocument 做白名单解析,但代价高,一般场景没必要。
为什么 mb_substr 替换后乱码,而 substr 不出问题
因为中文是多字节字符,substr 按字节切,可能截断 UTF-8 编码中的某个汉字,导致后续 str_replace 匹配失败或输出乱码;mb_substr 按字符切,安全但默认编码是 ISO-8859-1,不是 UTF-8。必须显式传参:mb_substr($text, 0, 100, 'UTF-8')。
更稳妥的做法:统一用 mb_* 函数族,并在脚本开头设好编码:mb_internal_encoding('UTF-8');。否则 mb_stripos 查“政治”可能返回 false,即使它明明存在。
容易被忽略的一点:MySQL 连接也要设 UTF-8,否则从数据库读出的词本身就是乱码,过滤自然失效 —— 检查 mysqli_set_charset($conn, 'utf8mb4') 是否执行。










