在Discuz! X3.4中实现全站内容过滤非中文字符及符号,可通过以下专业方案实现:
1. 核心过滤方案(推荐通过插件机制实现)
建议在`source/class/discuz/discuz_application.php`文件的`_init_input`方法后插入预处理逻辑:
- // 在插件机制中创建过滤类
- class non_cn_filter {
- public static function content_filter($content) {
- $pattern = '/[^\x{4e00}-\x{9fa5}\p{P}\s]/u'; // 保留中文/标点/空白符
- return preg_replace($pattern, '', $content);
- }
- }
- // 挂载到帖子内容处理流程
- $_G['forum_post']->message = non_cn_filter::content_filter($_G['forum_post']->message);
复制代码
2. 深度过滤增强方案(需覆盖全站输入点)
在`source/function/function_core.php`增加全局过滤函数:
- function dzxnet_character_filter($string) {
- $chinese_pattern = '/[^\x{4e00}-\x{9fa5}\x{3000}-\x{303F}\x{FF00}-\x{FFEF}]/u';
- return preg_replace($chinese_pattern, '', $string);
- }
- // 应用过滤到关键位置:
- $_GET = array_map('dzxnet_character_filter', $_GET);
- $_POST = array_map('dzxnet_character_filter', $_POST);
复制代码
3. 正则表达式优化说明
- `\x{4e00}-\x{9fa5}` 匹配所有CJK统一汉字
- `\x{3000}-\x{303F}` 匹配CJK标点符号
- `\x{FF00}-\x{FFEF}` 匹配全角ASCII/标点
- `u`修饰符启用UTF-8模式
4. 性能优化建议
建议在MySQL中建立预处理触发器:
- DELIMITER $$
- CREATE TRIGGER content_filter_before_insert
- BEFORE INSERT ON pre_forum_post
- FOR EACH ROW
- BEGIN
- SET NEW.message = REGEXP_REPLACE(NEW.message, '[^\\u4e00-\\u9fa5\\p{P}\\s]', '');
- END$$
- DELIMITER ;
复制代码
5. 高级配置方案
创建`config/config_non_cn_filter.php`配置文件:
- $_config['filter']['whitelist'] = array(
- 'username' => false, // 是否过滤用户名
- 'password' => false, // 密码字段不过滤
- 'email' => false, // 保留邮箱格式
- 'signature' => true // 过滤签名
- );
复制代码
特别提示:
1. 该方案会影响所有用户输入(含注册/发帖/私信等)
2. 建议在测试环境验证后部署
3. 对富文本编辑器需要额外处理UBB代码
4. 可搭配DZX.net的[内容净化插件]进行可视化配置
如需进一步优化过滤规则或获取现成解决方案,可访问DZ插件网技术文档专区查询《全角字符转换技术白皮书》。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |