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

3

我有一个非常简单的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;}

[列表]
[*] adfasdfdf
[*] asdfadsf
[*] asdfadss
[/列表]

只有第一个元素被转换为HTML列表元素,其余保留为BBCode格式:

  • adfasdfdf
  • [*] asdfadsf
    [*] asdfadss

    我尝试了使用"\s"、"\S"和"\n"进行操作,但我更习惯于PHP正则表达式,对Javascript正则表达式完全不熟悉。有什么建议吗?

    2个回答

    4

    如果要匹配多个内容,您需要使用带有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);
    

    1

    尝试在您的正则表达式模式中添加 g 和 m 开关 /<regex>/gm


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接