2010-04-30 72 views
3

我有一個非常簡單的Javascript BBCode解析器,用於客戶端實時預覽(不希望爲此使用Ajax)。問題IST,此解析器只能識別所述第一列表元素:Javascript BBCode解析器只識別第一個列表元素

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正則表達式。有什麼建議麼?

    回答

    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切換到您正則表達式模式。