返回列表 发布新帖
查看: 85|回复: 0

[代码技巧] Discuz编辑器换行时,出现多余<br>标签问题的解决思路

[复制链接]
SunJu_FaceMall
社区贡献

315

主题

190

回帖

1万

积分

等级头衔
Icon组别 : 管理员
Icon等级 :

积分成就
   钻石 : 524 颗
   贡献 : 1849 点
   金币 : 12 枚
Icon在线时间 : 1297 小时
Icon注册时间 : 2024-11-22
Icon最后登录 : 2025-12-9

荣誉勋章

会员LV.1会员LV.2会员LV.3会员LV.4会员LV.5会员LV.6会员LV.7会员LV.8会员LV.9会员LV.10

风云·优秀版主

飞流名人堂成员

1

实名认证 手机认证 vip vip-year FLLTCN发表于 2025-10-5 21:19:04 | 查看全部 |阅读模式 浙江金华

资源无需等待,交易就趁现在,全面资源整合网络大咖云集,让你轻松玩转互联网!

您需要 登录 才可以下载或查看,没有账号?立即注册

×

这个问题是discuz历年版本来一直存在的问题了,最近研究了一下,没有最终解决,但是我似乎发现了重要线索,记录一下吧。

关键性文件static/js/bbcode.js,现在我们来分析一下。

在 Discuz! 3.5 的bbcode.js中,涉及文字换行与<br>标签转换的核心代码主要集中在 bbcode2html(BBcode 转 HTML) 和 html2bbcode(HTML 转 BBcode) 两个核心函数中,同时包含一处针对 Chrome 浏览器的换行兼容性修复。以下是具体代码及功能说明:

一、核心场景 1:BBcode 转 HTML(将文本换行符转为<br>)

bbcode2html函数的作用是将用户输入的 BBcode 语法转换为浏览器可识别的 HTML。其中,文本中的换行符(\r\n/\n/\r)会被替换为<br />标签,确保换行在页面上正常显示。

相关代码片段(位于bbcode2html函数末尾):

  1. if(!allowhtml || !fetchCheckbox('htmlon')) {
  2.     str = str.replace(/(^|>)([^<]+)(?=<|$)/ig, function($1, $2, $3) {
  3.         // 替换制表符、空格,并将所有换行符(\r\n|\n|\r)转为<br />
  4.         return $2 + preg_replace(
  5.             ['\t', '   ', '  ', '(\r\n|\n|\r)'],  // 匹配目标:制表符、多空格、换行符
  6.             ['&nbsp; &nbsp; &nbsp; &nbsp; ', '&nbsp; &nbsp;', '&nbsp;&nbsp;', '<br />'],  // 替换结果:空格占位符、<br>换行
  7.             $3
  8.         );
  9.     });
  10. }
复制代码
功能说明:
  • 触发条件:当页面不允许 HTML 输入(!allowhtml)或用户未勾选 “允许 HTML”(!fetchCheckbox('htmlon'))时生效。
  • 核心逻辑:通过正则匹配文本中 “非 HTML 标签包裹的内容”,将其中的:
    • 制表符(\t)→ 4 个空格占位符( );
    • 3 个空格 → 2 个空格占位符;
    • 2 个空格 → 2 个空格占位符;
    • 所有换行符(\r\n Windows 换行、\n Unix/Linux 换行、\r 旧 Mac 换行)→ <br />标签,实现文本换行的 HTML 渲染。
二、核心场景 2:HTML 转 BBcode(将<br>标签转为文本换行符)
该函数负责将 HTML 中的<br>标签反向转换为文本换行符(\n),确保编辑时换行符正常保留。
1. 修复 “首个回车无法换行” 的<br>插入(位置:html2bbcode函数开头)
  1. // fix first enter cannot start new line
  2. var divPos = strpos(str,"<div>");
  3. if(divPos > 0 ){
  4.     if(divPos > 4 && str.substr(divPos - 4,4) == '</p>'){}
  5.     else{
  6.         // 在<div>前插入<br>,确保首个换行生效
  7.         str = str.substr(0,divPos) + '<br>'+ str.substr(divPos);
  8.     }
  9. }
  10. // end
复制代码
功能:修复编辑器中 “首个回车无法生成换行” 的问题 —— 当 HTML 中<div>标签前无<br>时,手动插入<br>,确保换行逻辑正常。
另外html2bbcode函数的作用是将 HTML 内容反向转换为 BBcode(例如编辑器切换 “源码模式” 时)。其中,HTML 中的<br>标签会被替换为文本换行符(\n),确保换行逻辑在 BBcode 中保留。
相关代码片段(位于html2bbcode函数中部):
  1. // 1. 先清除带“clear: both”样式的<br>(通常用于浮动元素换行,无需保留)
  2. str = str.replace(/<br\s+?style=(["']?)clear: both;?(\1)[^\>]*>/ig, '');
  3. // 2. 将所有剩余的<br>标签(含变体,如<br/>、<br >)转为文本换行符(\n)
  4. str = str.replace(/<br[^\>]*>/ig, "\n");
复制代码
相关代码片段(位于html2bbcode函数前部):
功能说明:
第一步:过滤掉用于 “清除浮动” 的特殊<br>(如<br style="clear: both;">),这类<br>是布局用,不代表用户输入的换行,因此直接删除。
第二步:通过正则/<br[^\>]*>/ig匹配所有标准<br>标签(包括<br>、<br/>、<br class="xxx">等变体),统一替换为文本换行符\n,确保换行逻辑在 BBcode 中正常保留。
三、兼容性修复:Chrome 浏览器中<div>与<br>的换行处理由于 Chrome 浏览器对<div>标签的默认渲染逻辑特殊,html2bbcode中专门增加了针对 Chrome 的换行兼容性修复,避免换行丢失或重复。
相关代码片段(位于html2bbcode函数前部):
  1. if(navigator.userAgent.indexOf('Chrome') > -1){
  2.     // 1. 将空<div><br></div>(Chrome中换行的默认生成结构)转为单个<br>
  3.     str = str.replace(/<div><br><\/div>/ig, '<br>');
  4.     // 2. 在<div>开头添加<br>,确保Chrome中<div>的换行被识别
  5.     str = str.replace(/<div>/ig, '<br><div>');
  6.     // 3. 合并<div>之间的多个<br>,避免重复换行
  7.     str = str.replace(/<\/div>((<br[^>]*>){1,})<div>/ig, '$1');
  8. }
复制代码
功能说明:
  • Chrome 浏览器在富文本编辑时,会将用户的 “换行” 自动生成<div><br></div>或<div></div>结构,而非标准<br>。
  • 这段代码通过正则调整该结构:
    • 空的<div><br></div> → 简化为<br>,避免冗余标签;
    • 普通<div>开头添加<br>,确保换行被后续 “<br>转\n” 逻辑识别;
    • 合并<div>之间的多个<br>,避免转换后出现重复换行。
image.webp
路虽远,行则将至;事虽难,做则必成。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

飞流广播+ 发布

系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
10-30 17:02
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
10-09 09:07
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-24 09:00
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-11 11:40
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
09-02 09:17
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-27 08:56
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-20 15:12
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
08-03 10:22
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
06-30 08:57
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
06-18 09:14
系统消息:清风网络已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
04-11 09:40
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-10 09:31
系统消息:IXM77777已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-09 13:44
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-09 09:22
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
04-09 08:52
系统消息:清风网络已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-08 09:24
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
04-07 09:02
系统消息:柒沐已经连续答对10道难题,逆天学霸谁与争锋?!#每日答题#
02-27 09:35
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
02-26 09:06
系统消息:柒沐已经连续答对3道难题,逆天学霸谁与争锋?!#每日答题#
02-25 08:49
站内通告

提供资源交易、信息共享、靓号交流、技术变现、学习问答、兴趣娱乐等全面服务。

1.丰富功能系统,扩展社区特色玩法,打造最好的互联网聚集圈子。

2.准确信息真实交易,安全快捷又方便,让虚拟交易面对面。

3. 天上不会掉馅饼,话术骗术迷人心,切勿脱离平台线下交易,被骗与平台无关!

4. 欺诈骗钱,违规违法将视情受到警告&禁言&封号甚至检举至👮🏻‍♀️处理!

官方Q群:123129钉推群:BAYR2383 站长QQ:3220000000

投诉/建议/商务合作联系

fl@fllt.cn

严禁私下交易,被骗与本站无关。
违反交易细则,取证立查严惩。
  • 钉钉新帖推送群
  • 官方交流QQ群
  • 站长唯一微信号

👮曝光Ta|🧿小黑屋|📴手机页|飞流网 ( 渝ICP备2025054677号-1|电信增值许可 渝B2-20250789 )|网站地图

GMT+8, 2025-12-10 13:42 , Processed in 0.088173 second(s), 59 queries, MemCached On , Gzip On.

Based on XJ-TX X3.5 Licensed

飞流论坛 HanAnalytics icp Astro vhAstro-Theme

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表