Javascript BBCode 解析器仅识别第一个列表元素

发布于 2024-08-31 08:42:21 字数 1140 浏览 10 评论 0原文

我有一个非常简单的 Javascript BBCode 解析器,用于客户端实时预览(不想使用 Ajax)。问题是,这个解析器只识别第一个列表元素:

function bbcode_parser(str) {
search = new Array(
      /\[b\](.*?)\[\/b\]/,  
      /\[i\](.*?)\[\/i\]/,
      /\[img\](.*?)\[\/img\]/,
      /\[url\="?(.*?)"?\](.*?)\[\/url\]/,
      /\[quote](.*?)\[\/quote\]/,
      /\[list\=(.*?)\](.*?)\[\/list\]/i,
      /\[list\]([\s\S]*?)\[\/list\]/i,
      /\[\*\]\s?(.*?)\n/);

replace = new Array(
      "<strong>$1</strong>",
      "<em>$1</em>",
      "<img src=\"$1\" alt=\"An image\">",
      "<a href=\"$1\">$2</a>",
      "<blockquote>$1</blockquote>",
      "<ol>$2</ol>",
      "<ul>$1</ul>",
      "<li>$1</li>");

for (i = 0; i < search.length; i++) {
    str = str.replace(search[i], replace[i]);
}

return str;}

[list]
[*] adfasdfdf
[*] asdfadsf
[*] asdfadss
[/list]

只有第一个元素被转换为 HTML List 元素,其余元素保持为 BBCode:

  • adfasdfdf
  • [*] asdfadsf
    [*] asdfadss

    我尝试使用“\s”、“\S”和“\n”,但我主要习惯 PHP 正则表达式,而对 Javascript 正则表达式完全陌生。有什么建议吗?

    I have a really simple Javascript BBCode Parser for client-side live preview (don't want to use Ajax for that). The problem ist, this parser only recognizes the first list element:

    function bbcode_parser(str) {
    search = new Array(
          /\[b\](.*?)\[\/b\]/,  
          /\[i\](.*?)\[\/i\]/,
          /\[img\](.*?)\[\/img\]/,
          /\[url\="?(.*?)"?\](.*?)\[\/url\]/,
          /\[quote](.*?)\[\/quote\]/,
          /\[list\=(.*?)\](.*?)\[\/list\]/i,
          /\[list\]([\s\S]*?)\[\/list\]/i,
          /\[\*\]\s?(.*?)\n/);
    
    replace = new Array(
          "<strong>$1</strong>",
          "<em>$1</em>",
          "<img src=\"$1\" alt=\"An image\">",
          "<a href=\"$1\">$2</a>",
          "<blockquote>$1</blockquote>",
          "<ol>$2</ol>",
          "<ul>$1</ul>",
          "<li>$1</li>");
    
    for (i = 0; i < search.length; i++) {
        str = str.replace(search[i], replace[i]);
    }
    
    return str;}
    

    [list]
    [*] adfasdfdf
    [*] asdfadsf
    [*] asdfadss
    [/list]

    only the first element is converted to a HTML List element, the rest stays as BBCode:

  • adfasdfdf
  • [*] asdfadsf
    [*] asdfadss

    I tried playing around with "\s", "\S" and "\n" but I'm mostly used to PHP Regex and totally new to Javascript Regex. Any suggestions?

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

    评论(2

    秋日私语 2024-09-07 08:42:21

    对于多个匹配,您需要使用带有 g 修饰符的正则表达式:

      /\[b\](.*?)\[\/b\]/g,  
      /\[i\](.*?)\[\/i\]/g,
      /\[img\](.*?)\[\/img\]/g,
      /\[url\="?(.*?)"?\](.*?)\[\/url\]/g,
      /\[quote](.*?)\[\/quote\]/g,
      /\[list\=(.*?)\](.*?)\[\/list\]/gi,
      /\[list\]([\s\S]*?)\[\/list\]/gi,
      /\[\*\]\s?(.*?)\n/g);
    

    For multiple matches you will need to use a regular expression with the g modifier:

      /\[b\](.*?)\[\/b\]/g,  
      /\[i\](.*?)\[\/i\]/g,
      /\[img\](.*?)\[\/img\]/g,
      /\[url\="?(.*?)"?\](.*?)\[\/url\]/g,
      /\[quote](.*?)\[\/quote\]/g,
      /\[list\=(.*?)\](.*?)\[\/list\]/gi,
      /\[list\]([\s\S]*?)\[\/list\]/gi,
      /\[\*\]\s?(.*?)\n/g);
    
    用心笑 2024-09-07 08:42:21

    尝试将 g 和 m 开关 //gm 开关添加到您的正则表达式模式中。

    try adding the g and m switches /<regex>/gm switches to your regex patterns.

    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文