Javascript 不解析嵌套 Bbcode

2023-12-28

我编写了一个 Javascript bbcode,类似于我用来编写此消息的代码。它还包含一个实时预览框,如下所示。我目前面临的唯一问题是某些嵌套的 bbcode 无法解析。

例如:

[quote]
   [quote][/quote]
[/quote]

解析不正确。

这是我目前的 JavaScript。

function preview() {

    var txt = $('#editor').val();
    txt = txt.replace(/</g,'&lt;');
    txt = txt.replace(/>/g,'&gt;');

    txt = txt.replace(/[\r\n]/g,'%lb%');

    var find    = [
                   /\[quote\](.*?)\[\/quote\]/gi,
                   /\[quote author="(.*?)" date="(.*?)"\](.*?)\[\/quote\]/gi,
                   /\[b\](.*?)\[\/b\]/gi,
                   /\[i\](.*?)\[\/i\]/gi,
                   /\[u\](.*?)\[\/u\]/gi,
                   /\[left\](.*?)\[\/left\]/gi,
                   /\[center\](.*?)\[\/center\]/gi,
                   /\[right\](.*?)\[\/right\]/gi,
                   /\[size=(10|12|24|30)](.*?)\[\/size\]/gi,
                   /\[font=(.*?)](.*?)\[\/font\]/gi,
                   /\[color=(.*?)](.*?)\[\/color\]/gi,
                   /\[url(?:\=?)(.*?)\](.*?)\[\/url\]/gi,
                   /\[email=(.*?)\](.*?)\[\/email\]/gi,
                   /\[email\](.*?)\[\/email\]/gi,
                   /\[img(.*?)\](.*?)\[\/img\]/gi,
                   /(?:%lb%|\s)*\[code(?:\=?)(?:.*?)\](?:%lb%|\s)*(.*?)(?:%lb%|\s)*\[\/code\](?:%lb%|\s)*/gi,

                   /\[list(.*?)\](.*?)\[\*\](.*?)(?:%lb%|\s)*(\[\*\].*?\[\/list\]|\[\/list\])/i,
                   /(?:%lb%|\s)*\[list\](?:%lb%|\s)*(.*?)(?:%lb%|\s)*\[\/list\](?:%lb%|\s)*/gi,
                   /(?:%lb%|\s)*\[list=(\d)\](?:%lb%|\s)*(.*?)(?:%lb%|\s)*\[\/list\](?:%lb%|\s)*/gi,
                   /(?:%lb%){3,}/g

                   ];
    var replace = [
                   '<blockquote><div class="quote"><div class="quote_body">$1</div></div></blockquote>',
                   '<blockquote><div class="quote"><div class="quote_author"><span class="quote_from">Quote from</span> <span class="author">$1</span> on <span class="date">$2</span></div><div class="quote_body">$3</div></div></blockquote>',
                   '<b>$1<\/b>',
                   '<i>$1<\/i>',
                   '<u>$1<\/u>',
                   '<div class="align_left">$1<\/div>',
                   '<div class="align_center">$1<\/div>',
                   '<div class="align_right">$1<\/div>',
                   '<span style="font-size:$1px;">$2</span>',
                   '<span style="font-family:$1;">$2</span>',
                   '<span style="color:$1;">$2</span>',
                   '<a href="$1">$2</a>',
                   '<a href="mailto:$1">$2</a>',
                   '<a href="mailto:$1">$1</a>',                   
                   '<img $1 src="$2" />',
                   '<pre><code>$1</code></pre>',
                   '[list$1]$2<li>$3</li>$4',
                   '<ul>$1</ul>',
                   '<ol start=$1>$2</ol>',
                   '%lb%%lb%'

                   ];

    // fix [*] so that they only work inside [/list]
    for(var i in find)
    {
        txt = txt.replace(find[i],replace[i]);
        if(i == 17) while(txt.match(find[i],replace[i])) txt = txt.replace(find[i],replace[i]);
    }

    // Fix Smilies
    txt = txt.replace(/%lb%/g,'<br />');
    txt = txt.replace(/\:\)/g, '<img class="smiley" src="/img/smilies/smile.gif">');
    txt = txt.replace(/\:-\)/g, '<img class="smiley" src="/img/smilies/happy.gif">');
    txt = txt.replace(/\:D/g, '<img class="smiley" src="/img/smilies/biggrin.gif">');
    txt = txt.replace(/\:\(/g, '<img class="smiley" src="/img/smilies/sad.gif">');
    txt = txt.replace(/8\)/g, '<img class="smiley" src="/img/smilies/cool.gif">');
    txt = txt.replace(/=O/g, '<img class="smiley" src="/img/smilies/surprised.gif">');
    txt = txt.replace(/\:-\|\|/g, '<img class="smiley" src="/img/smilies/mad.gif">');
    txt = txt.replace(/\:P/g, '<img class="smiley" src="/img/smilies/stongue.gif">');
    txt = txt.replace(/\}\-\(/g, '<img class="smiley" src="/img/smilies/confused.gif">');

    // Format Dates
    txt = txt.replace(/\d{10}/g, function($0) {
        var d = new Date($0*1000);
        var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
        return "" + months[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear() + ", " + (d.getHours()%12) + ":" + d.getMinutes() + " " + (d.getHours()<12 ? 'AM' : 'PM');
    });

    // Update the preview box
    $('.preview').html(txt);
}

这会翻转我所有的 bbcode 标签。引用标签存在问题,因为它有时不会翻转嵌套的引用标签或解析内部引用标签的内容。

如果有人能够提供解决方案,我将非常感激。谢谢你!


三种解决方案:

  1. 编写一个解析器。这将产生最佳解决方案,但需要付出巨大的努力。

  2. 找到一个BBCode解析库。质量可能与第一名一样好,而且更容易。

  3. 在每个标签正则表达式的内部添加一个否定的前瞻并连续应用直到没有匹配。例如。:

    \[quote\]((?:[^](?!\[quote\]))*?)\[\/quote\]
    

    这将捕获内部引用,然后一旦替换,就捕获外部引用。不像其他两个那么干净,但可能是最快的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 不解析嵌套 Bbcode 的相关文章

  • 最小的 ExtJS 包是什么?

    有谁知道 Ext JS 2 2 所需的最少文件吗 我知道 ExtJS 网站有一个功能 build http extjs com products extjs build ExtJS ext js 的小版本 作为 ext all js 的替代
  • Perl 正则表达式匹配模式的多个实例并替换

    我有一个看起来像这样的字符串 abc 1 2 3 something here foo 10 6 34 somethingelse here def 1 2 another 我想将此字符串拆分为一个数组 其中包含 abc 1 2 3 som
  • 如何通过 .htaccess 删除 URL 中任何位置的空参数或参数?

    我的意思是空参数可以在 URL 中的任何位置 每次不同的位置 每次使用不同的名称 每次在不同的 php 页面上 例如 http www example com AnyPHPpageHere php parameter1 7 paramete
  • React延迟加载/无限滚动解决方案

    我花了一段时间才弄清楚如何使用优秀的延迟加载图像React Lazyload 组件 https github com jasonslyvia react lazyload 演示在滚动时延迟加载图像 但在测试时我无法获得相同的行为 罪魁祸首是
  • 捕获外部脚本文件中的 javascript 错误

    我有一点 JavaScript Jquery 工具的叠加层 http flowplayer org tools overlay index html 当放到错误使用它的页面上时可能会引发异常 我正在尝试优雅地处理它 我有一个通用的 wind
  • 代码点火器 JSON

    你好 我使用 codeigniter 然后我从控制器中的数据库中回显输出 然后在我的视图文件中执行以下操作 但它没有显示任何内容 S 我的模型文件 function forumList this gt db gt select oversk
  • 为什么“dtoa.c”包含这么多代码?

    我将是第一个承认我对低级编程的整体知识有点稀疏的人 我理解许多核心概念 但我不经常使用它们 话虽这么说 我对需要多少代码感到非常惊讶dtoa c http www netlib org fp dtoa c 在过去的几个月里 我一直致力于用
  • React:React 如何确保在浏览器有机会绘制之后调用 useEffect?

    useLayoutEffect 的文档说 useLayoutEffect 内计划的更新将被刷新 在浏览器有机会绘制之前同步进行 useEffect 的文档说 与 componentDidMount 和 componentDidUpdate
  • NodeJS 无法加载 css 文件

    所以我正在尝试制作一个 NodeJS 服务器 并且我尝试保留尽可能少的附加组件 但是 我遇到了一个问题 我似乎无法加载任何内容CSS我调用的文件HTML文件 该调用似乎确实由服务器处理 但它不会显示在浏览器中 My 网络服务器 js fil
  • django ajax post 403被禁止

    使用 django 1 4 当我尝试从我的 javascript 做我的 django 服务器上的帖子时 我收到 403 错误 我的 get 工作正常 尽管问题仅出在帖子上 也尝试过 csrf exempt但没有运气 更新 我现在可以发布我
  • 禁用任何类型的浏览器窗口滚动?

    有没有办法禁用滚动 不仅仅是滚动条 还有浏览器窗口的全部功能 根据您对 Keit 的回答 您不想在打开灯箱时滚动处于活动状态 如果是这种情况 您可以使用以下 css 在打开灯箱的同时向正文添加一个类 这个解决方案的好处是它保留了滚动 空间
  • 对数字和字母元素的数组进行排序(自然排序)

    假设我有一个数组 var arr 1 5 ahsldk 10 55 3 2 7 8 1 2 75 abc huds 我尝试对其进行排序 我得到了类似的东西 1 1 10 2 2 3 5 55 7 75 8 abc ahsldk huds 注
  • chrome 扩展 - 将数据从后台传递到自定义 html 页面

    创建浏览器扩展 我必须从 background js 打开新选项卡并将 JSON 数据传递到这个新选项卡 在新选项卡中 我使用传递的 JSON 数据来操作 渲染 DOM 下面是我的 background js 的一部分 我在其中使用自定义
  • 如何为 ng-repeat orderBy 创建回调?

    寻找一种方法让 AngularJS 的 ng repeat orderBy 过滤器在完成渲染后执行回调 Markup div table thead tr th Name th th Age th tr thead tbody tr tr
  • Tween JS 基础知识之三个 JS 立方体

    我是 Tween JS 的新手 尝试使用 Tween 制作一个向右移动的简单动画 下面是我在 init 函数中的代码 我使用的是三个 JS var geometry new THREE CylinderGeometry 200 200 20
  • Jade(当前称为“Pug”)模板引擎中的循环

    我想使用一个简单的循环 例如for int i 0 i lt 10 i 如何在 Jade 引擎中使用它 我正在使用 Node js 并使用expressjs 框架 例如 for var i 0 i lt 10 i li array i 你可
  • 使用 dnode 从服务器向客户端发送消息

    几个月前 我发现了 nowjs 和 dnode 并最终使用了 nowjs 并且https github com Flotype nowclient https github com Flotype nowclient 用于客户端 服务器双向
  • 使用 JavaScript 从 URL 变量读取来加载不同的 CSS 样式表

    我试图在我的 WordPress 博客上使用两个不同的样式表 以便在通过 Web 访问页面时使用一个样式表 而在通过我们的 iOS 应用程序访问博客内容时使用另一个样式表 现在 我们将 app true 附加到来自 iOS 应用程序的 UR
  • 响应式菜单:悬停子菜单显示错误

    简而言之 我根据教程创建了一个响应式菜单 当您将鼠标悬停在投资组合按钮上时 菜单应该显示子菜单 而在移动模式下 您需要按该按钮才能显示子菜单 效果很好 问题是该教程有一个错误 如果您在桌面模式下按组合按钮 子菜单将不会再次显示 除非您按 单
  • 我可以防止将 Leaflet 地图平移到世界边缘之外吗?

    有没有办法限制平移到世界边缘之外 在这幅画中 棕色是世界 灰色是虚空 我想让它不可能像这样平移 Leaflet 允许您控制地图抵抗被拖出边界的程度maxBoundsViscosity选项 值 0 到 1 将其设置为最大值会完全禁用拖动出界

随机推荐

  • 从固定文档序列中获取固定文档

    相当简单 我正在从磁盘中取出一个 XPSDocument 我想从这个 XpsDocument 中获取固定文档 但我遇到了一些麻烦 因为我只能获取固定文档序列 而且我不知道如何从该序列中提取 XpsDocuments 到目前为止我已经尝试过类
  • 在表单提交上运行 JavaScript 函数

    试图重新回到 Javascript 在这个非常基本的事情上遇到了一些麻烦 https jsfiddle net gfitzpatrick2 aw27toyv 3 https jsfiddle net gfitzpatrick2 aw27to
  • 使用 jQuery 删除第一个列表元素

    我有以下清单 ul li 1 li li 2 li li 3 li li 4 li li 5 li li 6 li ul 如何使用 jQuery 删除此列表的第一个元素 即数字 1 并保持其余元素不变 我本以为这有一个非常简单的解决方案 但
  • Visual Studio 2012 无法识别现有的单元测试

    我之前创建了一个单元测试项目 然后暂时将其从我的解决方案中删除 现在我已将其添加回来 Visual Studio 未检测到我的单元测试 并且我不知道如何运行它们 我在网上查了一下 看到有一些关于 测试工具 设置的解决方案 但它似乎在VS 2
  • wget 与 python 时间限制

    我有一个很大的 URL 文本文件 必须通过 wget 下载 我编写了一个小的 python 脚本 它基本上循环遍历每个域名并使用 wget os system wget URL 下载它们 但问题是 如果远程服务器在连接后没有回复 wget
  • 离散二维数据的线性插值

    所以我有一些不规则间隔的数据 我想将它们插值到规则网格上 我想做的正是this https stackoverflow com questions 3864899 resampling irregularly spaced data to
  • XML 预览中的渲染问题:无法找到模式 0 [重复]

    这个问题在这里已经有答案了 更新android studio后渲染时出现异常 渲染期间引发异常 无法定位模式 0 java lang IllegalStateException Unable to locate mode 0 at andr
  • 使用 Flask 查找 jinja2 模板中的数字总和

    我正在学习 Flask 并尝试创建一个网络应用程序 它接受学生的姓名和分数 查找所有分数的总和并在表格中显示内容 但总数总是显示为0 代码如下 标记总计 py from flask import Flask render template
  • 批处理文件:查找子字符串是否在字符串中(不在文件中)

    在批处理文件中 我有一个字符串abcdefg 我想检查一下是否bcd是在字符串中 不幸的是 我找到的所有解决方案似乎都在搜索file对于子字符串 而不是对于子字符串的字符串 有一个简单的解决方案吗 是的 您可以使用替换并检查原始字符串 if
  • 旅行商问题中的交叉边缘

    是否存在最优解具有交叉边的旅行商问题 节点位于 x y 平面中 因此在这种情况下交叉意味着如果要绘制图形 连接四个单独节点的两条线段将相交 如果闭合折线中的两条边相交 则存在一条顶点相同但周长较小的折线 这是三角不等式的结果 因此 TSP
  • 初始化元素不是常量

    我想创建向量表来创建MCU的启动代码 当我尝试将函数地址放入向量表时 编译器会产生错误 initialiser element is not constant void reset handler void uint32 t const v
  • Blob 下载在 IE 中不起作用

    我的 Angular js 控制器中有这个下载 CSV 文件 var blob new Blob csvContent join type text csv charset utf 8 var link document createEle
  • 执行一个循环需要多少时间?

    有没有办法知道java中一个循环执行需要多少秒 例如 for int i 0 i lt 1000000 i Do some difficult task goes in here 它不必 100 准确 但只需了解可能需要多长时间即可 内部算
  • pm2 start 运行但网站无法正常工作

    我有一个用yarn构建的nodeJS项目 我可以使用 yarn start 在服务器上运行该应用程序 它工作正常 当使用yarn运行时 它会运行dist app js文件 但是当我使用 pm2 start app js 运行它时 pm2 进
  • 删除域名后缀

    所以假设我有just a domain com just a domain info just a domain net我怎样才能删除扩展程序 com net info 我需要两个变量的结果 一个包含域名 另一个包含扩展名 我尝试过str
  • 在 Visual Studio 2013 测试代理上使用 Shims 运行测试

    我在许多网站上发现了这个问题的各种迭代 但是到目前为止 我还没有找到任何可以提供有效的完整答案的内容 我刚刚设置了一些 Visual Studio 测试代理 它们似乎都表现良好并运行我们最初计划在它们上运行的大部分单元测试 然而 当我检查其
  • 在maven发布时提交一些文件:准备

    是否可以在 mvn release prepare 时提交一些文件 没有 pom xml 在我的 MultiModul 项目中 我使用 PreparationGoals 配置了 rlease 插件来更改 sql 文件中的版本
  • 如何在 javascript 全局命名空间中存根/模拟函数

    我试图在测试期间存根 模拟 覆盖函数调用 将日志写入数据库 function logit msg writeMessageToDb msg function tryingToTestThisFunction var error proces
  • PHP+Ajax登录

    只是通过 ajax 提交登录表单时遇到一些问题 我主要是一名 PHP 开发人员 我不经常将 Jquery Ajax 与 PHP 结合使用 目前 如果我在提交表单后检查 firebug POST 数据 它似乎确实获取了已添加到表单中的用户名和
  • Javascript 不解析嵌套 Bbcode

    我编写了一个 Javascript bbcode 类似于我用来编写此消息的代码 它还包含一个实时预览框 如下所示 我目前面临的唯一问题是某些嵌套的 bbcode 无法解析 例如 quote quote quote quote 解析不正确 这