Javascript BBCode Parser распознает только первый элемент списка - PullRequest
3 голосов
/ 30 апреля 2010

У меня очень простой Javascript BBCode Parser для предварительного просмотра на стороне клиента (не хочу использовать 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
[/ list]

только первый элемент преобразуется в элемент списка HTML, остальные остаются как BBCode:

adfasdfdf [*] asdfadsf
[*] asdfadss

Я пытался поиграться с "\ s", "\ S" и "\ n", но я в основном привык к PHP Regex и совершенно не знаком с Javascript Regex. Есть предложения?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2010

Для нескольких совпадений вам нужно использовать регулярное выражение с модификатором 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 голос
/ 30 апреля 2010

попробуйте добавить переключатели g и m /<regex>/gm в шаблоны регулярных выражений.

...