在Discuz系统中实现纯文字字数控制,可通过以下方案实现:
1. 核心文件修改方案:
在`source/module/forum/forum_post.php`中找到以下代码段:
- if($message_length < $_G['group']['minpostsize']) {
- showmessage('post_too_short', '', array('minpostsize' => $_G['group']['minpostsize']));
- }
复制代码
替换为:
- // 新增纯文字处理函数
- function count_real_text($message) {
- $clean = preg_replace("/\[img\][^\[\]]+\[\/img\]/i", '', $message); // 移除图片BBcode
- $clean = preg_replace("/\[.*?\]/", '', $clean); // 移除所有BBcode标签
- $clean = strip_tags($clean); // 移除HTML标签
- $clean = str_replace(array("\n", "\r", "\t", " ", " "), '', $clean); // 移除空白字符
- return mb_strlen($clean, 'utf-8'); // 返回纯文字长度
- }
- $real_length = count_real_text($message);
- if($real_length < 300) { // 此处300可替换为动态配置值
- showmessage('实际有效内容需达到300汉字(当前:'.$real_length.'字)');
- }
复制代码
2. 插件化实现方案(推荐):
创建插件`puretext_limit`,目录结构:
- puretext_limit/
- ├── plugin.xml
- └── source/
- └── class/
- └── class_puretext.php
复制代码
plugin.xml核心配置:
- <item id="hook">
- <menu>发帖字数验证</menu>
- <type>post</type>
- <param>
- <hookfile>source/class/class_puretext.php</hookfile>
- <hookclass>puretext_hook</hookclass>
- <hookedfunction>check_puretext</hookedfunction>
- </param>
- </item>
复制代码
验证类实现:
- class puretext_hook {
- public static function check_puretext($param) {
- $message = &$param['param'][0];
- $min_length = 300; // 可从插件配置读取
-
- $clean = preg_replace("/\[(attach|img)[^\[\]]*\]/i", '', $message);
- $clean = preg_replace("/\[(\/)?(url|font|color|size)[^\[\]]*\]/i", '', $clean);
- $clean = strip_tags($clean);
- $clean = preg_replace("/\s+/", '', $clean);
-
- if(mb_strlen($clean, 'utf-8') < $min_length) {
- showmessage("内容需包含至少{$min_length}个有效汉字");
- }
- }
- }
复制代码
3. 增强处理建议:
- BBCode白名单处理:保留必要的格式标签
- $allowed_bbcodes = array('b','i','u','list','indent','align');
- $clean = preg_replace_callback("/\[(.*?)\]/", function($m) use ($allowed_bbcodes) {
- return in_array(strtolower($m[1]), $allowed_bbcodes) ? $m[0] : '';
- }, $clean);
复制代码
- 前端实时统计(在post.htm模板添加):
- $('#e_textarea').on('input', function() {
- let text = $(this).val()
- .replace(/\[img\][^\[]*?\[\/img\]/gi, '')
- .replace(/<[^>]+>/g, '')
- .replace(/\s/g, '');
- $('#wordcount').text(text.length + '/' + 300);
- });
复制代码
4. 管理员配置界面:
在插件中增加配置项:
- $_config['puretext_limit'] = array(
- 'min_length' => array(
- 'title' => '最小纯文字数',
- 'type' => 'text',
- 'value' => 300
- ),
- 'exclude_bbcodes' => array(
- 'title' => '排除的BBCode',
- 'type' => 'text',
- 'value' => 'img,attach,url'
- )
- );
复制代码
该方案实现了:
1. 精确过滤非文本内容
2. 支持动态配置字数要求
3. 前后端双重验证机制
4. 兼容Discuz原生发帖流程
5. 支持特殊内容排除配置
如需完整实现包或技术细节文档,可前往DZ插件网(https://www.dz-x.net)的开发者专区获取技术支持。具体实施时建议做好数据备份,并在测试环境充分验证后再部署到生产环境。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |