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 List 要素に変換され、残りは BBCode のままです。

  • adfasdfdf
  • [*] asdfadsf
    [*] asdfadss

    「\s」、「\S」、「\n」をいじってみましたが、PHP Regex にはほとんど慣れていて、Javascript Regex はまったく初めてです。助言がありますか?

    4

    2 に答える 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);
    
    于 2010-04-30T12:30:46.853 に答える
    1

    g および m スイッチ/<regex>/gmスイッチを正規表現パターンに追加してみてください。

    于 2010-04-30T12:31:01.430 に答える