当前位置:首页 > JavaScript

js实现ubb

2026-04-05 23:39:56JavaScript

UBB 转 HTML 的实现方法

UBB(Universal Bulletin Board)是一种常见的论坛标记语言,类似于 HTML 但更简单。以下是通过 JavaScript 将 UBB 转换为 HTML 的方法。

基本 UBB 标签替换

使用正则表达式替换常见的 UBB 标签为对应的 HTML 标签:

function ubbToHtml(ubbText) {
    let html = ubbText;

    // 加粗 [b]...[/b]
    html = html.replace(/\[b\](.*?)\[\/b\]/g, '<strong>$1</strong>');

    // 斜体 [i]...[/i]
    html = html.replace(/\[i\](.*?)\[\/i\]/g, '<em>$1</em>');

    // 下划线 [u]...[/u]
    html = html.replace(/\[u\](.*?)\[\/u\]/g, '<u>$1</u>');

    // 链接 [url]...[/url] 或 [url=...]...[/url]
    html = html.replace(/\[url=(.*?)\](.*?)\[\/url\]/g, '<a href="$1" target="_blank">$2</a>');
    html = html.replace(/\[url\](.*?)\[\/url\]/g, '<a href="$1" target="_blank">$1</a>');

    // 图片 [img]...[/img]
    html = html.replace(/\[img\](.*?)\[\/img\]/g, '<img src="$1" />');

    // 颜色 [color=...]...[/color]
    html = html.replace(/\[color=(.*?)\](.*?)\[\/color\]/g, '<span style="color:$1">$2</span>');

    // 字体大小 [size=...]...[/size]
    html = html.replace(/\[size=(.*?)\](.*?)\[\/size\]/g, '<span style="font-size:$1px">$2</span>');

    return html;
}

处理嵌套标签

上述方法无法处理嵌套标签(如 [b][i]...[/i][/b]),改进版本:

function ubbToHtmlAdvanced(ubbText) {
    const tags = [
        { ubb: /\[b\](.*?)\[\/b\]/g, html: '<strong>$1</strong>' },
        { ubb: /\[i\](.*?)\[\/i\]/g, html: '<em>$1</em>' },
        { ubb: /\[u\](.*?)\[\/u\]/g, html: '<u>$1</u>' },
        { ubb: /\[url=(.*?)\](.*?)\[\/url\]/g, html: '<a href="$1" target="_blank">$2</a>' },
        { ubb: /\[url\](.*?)\[\/url\]/g, html: '<a href="$1" target="_blank">$1</a>' },
        { ubb: /\[img\](.*?)\[\/img\]/g, html: '<img src="$1" />' },
        { ubb: /\[color=(.*?)\](.*?)\[\/color\]/g, html: '<span style="color:$1">$2</span>' },
        { ubb: /\[size=(.*?)\](.*?)\[\/size\]/g, html: '<span style="font-size:$1px">$2</span>' }
    ];

    let html = ubbText;
    let lastHtml;

    do {
        lastHtml = html;
        tags.forEach(tag => {
            html = html.replace(tag.ubb, tag.html);
        });
    } while (html !== lastHtml);

    return html;
}

处理换行和特殊字符

UBB 通常使用 \n 表示换行,需要转换为 <br>

js实现ubb

function ubbToHtmlWithNewlines(ubbText) {
    let html = ubbToHtmlAdvanced(ubbText);
    html = html.replace(/\n/g, '<br>');
    html = html.replace(/&/g, '&amp;')
               .replace(/</g, '&lt;')
               .replace(/>/g, '&gt;')
               .replace(/"/g, '&quot;')
               .replace(/'/g, '&#39;');
    return html;
}

使用示例

const ubbText = '[b]加粗文本[/b] [i]斜体文本[/i]\n[url=https://example.com]示例链接[/url]';
const html = ubbToHtmlWithNewlines(ubbText);
console.log(html);
// 输出: <strong>加粗文本</strong> <em>斜体文本</em><br><a href="https://example.com" target="_blank">示例链接</a>

注意事项

  1. 正则表达式中的 .*? 是非贪婪匹配,确保匹配最短的可能字符串
  2. 对于复杂的 UBB 代码(如嵌套标签),可能需要多次替换或更复杂的解析器
  3. 安全考虑:应对 URL 和图片链接进行验证,防止 XSS 攻击
  4. 性能考虑:对于大量文本,避免使用过于复杂的正则表达式

标签: jsubb
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…