当前位置:首页 > JavaScript

js实现ubb

2026-04-05 23:39:56JavaScript

UBB 转 HTML 的实现方法

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

js实现ubb

基本 UBB 标签替换

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

js实现ubb

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>

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实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…