piapia123
zh

UBB 与 HTML 互转

文本

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把论坛代码(UBB,也就是 Discuz! 那一套 `[b]` `[url]` `[img]`)转成 HTML,或者反过来。嵌套是这里最要紧的一件事:`[b]粗[i]斜[/i]还是粗[/b]` 必须产出正确嵌套的标签,而用一连串「查找替换」实现的转换做不到 —— `[/i]` 该对应哪一个 `[i]` 只有栈知道,替换式实现会产出交叉嵌套的标签,浏览器只能猜,页面就乱了。另外:认不出的标签原样保留(`[hide]`、`[attach]` 是各论坛自己的扩展,丢掉等于悄悄删掉用户的排版),`javascript:` 这类链接不产出可点的 `<a>`(产物要粘进论坛,那是一个 XSS 入口),正文里的 `<` `&` 会被转义(否则「1 < 2」会变成一个畸形标签,把后面整段都解析歪)。

功能

  • 行内标签:加粗、斜体、下划线、删除线、颜色、字号、字体、对齐
  • 链接的两种写法([url]地址[/url] 与 [url=地址]文字[/url])、邮箱、图片
  • 引用(含 [quote=某人] 的出处)、代码块、无序与有序列表
  • 嵌套标签的闭合顺序正确 —— 这是查找替换式实现做不到的
  • 没闭合的标签在末尾自动补上,多出来的结束标签当普通文本
  • 标签名不分大小写,[B] 与 [b] 一样
  • 字号按 Discuz 的 1–7 档位映射,不会变成 font-size: 7px
  • [code] 块里的方括号不解析 —— 那是代码本身
  • 认不出的标签原样保留,用户的排版不会消失
  • javascript: 这类链接退化成纯文字,不产出可点的 <a>
  • HTML → UBB 方向:段落、列表、引用、代码块、行内格式都覆盖
  • 全部在浏览器本地完成,内容不外传

使用方法

  1. 把论坛代码或 HTML 粘进输入框
  2. 方向通常不用选 —— 以 < 开头会按 HTML 处理
  3. 需要时关掉「换行转成 br」
  4. 复制结果

常见问题

为什么嵌套标签要用栈来处理?
因为 `[/i]` 该对应哪一个 `[i]`,只有看到完整的标签序列才知道。用「查找替换」逐个换的实现,遇到 `[b]粗[i]斜[/i]还是粗[/b]` 会产出交叉嵌套的标签(`<strong>粗<em>斜</strong>还是粗</em>`),浏览器只能自己猜怎么补,页面就乱了。而这类错误不会报任何错,只是显示不对。所以这里是栈式的:扫一遍、入栈出栈、最后把没闭合的补上。
认不出的标签会怎样?
原样保留,不转也不删。`[hide]`(回复可见)、`[attach]`(附件)、`[media]`(视频)都是各论坛自己的扩展,Discuz 之外的站点没有对应物,工具无从知道该变成什么。留着的话用户一眼能看出「这里有个东西没转」,剪掉的话他拿到的是一段缺内容的帖子,而屏幕上完全看不出来。
为什么有些链接没有变成链接?
因为它们的协议是 `javascript:`、`data:` 这类。产物是要粘进论坛或博客的,一个可点的 `javascript:` 链接在那里就是一个 XSS 入口。工具只放行 http、https、ftp、mailto、tel 等正常协议,其余的只保留文字、不产出 `<a>`。
字号 [size=5] 是多少像素?
Discuz 的字号是 1–7 的档位而不是像素值,直接当数字用会得到 `font-size: 7px` —— 一个连字都看不清的值。这里按 Discuz 模板里实际用的档位映射:1→12px、3→16px(默认)、5→24px、7→48px。认不出的档位退回 16px。
换行要不要转成 br?
论坛的约定是「换行就是换行」,所以默认转。但有些站点在渲染时本来就按 CSS 的 `white-space: pre-wrap` 处理,那种情况下再插 `<br>` 会让每个空行都变成两倍行距。如果你粘过去发现行距变大了,把这个选项关掉即可。
内容会被上传吗?
不会。转换全在浏览器内存里完成,页面不发送任何请求,断网也能用。

相关工具