2010-04-30 5 views
3

J'ai un analyseur BBCode Javascript très simple pour l'aperçu en direct côté client (ne pas utiliser Ajax pour cela). Le problème ist, cet analyseur ne reconnaît que le premier élément de la liste:Javascript BBCode Parser reconnaît seulement le premier élément de la liste

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;} 

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

seul le premier élément est converti en un élément de liste HTML, le reste reste aussi BBCode:

  • adfasdfdf
  • [*] asdfadsf
    [*] asdfadss

    J'ai essayé de jouer avec "\ s", "\ S" et "\ n", mais je suis surtout utilisé pour PHP Regex et totalement nouveau pour Javascript Regex. Aucune suggestion?

    Répondre

    4

    Pour plusieurs matchs, vous devrez utiliser une expression régulière avec le modificateur 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

    essayer d'ajouter les commutateurs g et m /<regex>/gm passe à vos habitudes de regex.

    Questions connexes