0

BBCode を HTML に変換する Javascript がありますが、これはうまく機能しているように見えますが、問題があります。

これは、BB タグ [b] と [/b] を <b> と </b> に変換するために使用する、機能する式の 1 つです。

str = str.replace(/\[b\]((\s|\S)*?)\[\/b\]/ig, '<b>$1</b>');

これにより、連続したタグも変換されます。例えば

[b]str1[/b] [b]str2[/b]

になる

str1 str2

どっちがいい; それが私がやりたいことです。ただし、そのように引用タグを一致させようとすると

str = str.replace(/\[quote\]((\s|\S)*?)\[\/quote\]/ig, '<span class="quotebox">$1</span>');

str はどこですか

[引用]ネスト レベル 1[引用]ネスト レベル 2[/引用][/引用]

最初のタグのみが一致して変換されるため、最終的に次のような出力が得られます

ネスト レベル 1 [引用]ネスト レベル 2

[/見積もり]

最後の引用タグが引用ボックスの外側にある場合 - 他の引用タグ内にネストする必要があります。ヘルプ?

また、関連する場合、quotebox クラスは次のとおりです。

.quotebox{
border:1px はめ込み黒;
表示ブロック;
margin-bottom:5px;
マージントップ:5px;
パディング:2px 2px 2px 4px;
}

4

1 に答える 1

1

(実際の) 正規表現は正規言語しか記述できないという事実に悩まされています。正規表現で説明できない顕著な特徴は再帰です。これの標準的な例は、Dyck 言語です()。この言語は、(())()((()))、、 などのバランスの取れた括弧のすべての文字列で構成されています((((()))))。これは非正規であり、本質的に解決しようとしている問題です: [b][/b]s、[quote][/quote]など。つまり、正規表現でやりたいことを行うことは文字通り不可能です。しかし、私が「本物」と言ったことに気づいたかもしれません。JavaScript などの言語で提供される正規表現は、真の正規表現ではありません。それらは、主に(完全に?)後方参照に起因する特別な力を持っています。たとえば、 regex(.*)\1は非正規言語を表します。とはいえ、これを踏まえても、あなたがダイク語に匹敵するとは思えません。1

それで、解決策は何ですか?JavaScript で書かれた既存の BBCode から HTML へのコンバーターを見つけてください! これは間違いなくあなたの人生を最もシンプルにするでしょう。残念ながら、私はあまり JavaScript プログラミングを行っていないので、思い浮かんだことはわかりません。 このStackOverflowの質問そのようなものが存在しない可能性があることを示します。その場合、唯一のオプションは独自のパーサーをロールすることです。もちろん、より複雑ですが、確かに実行可能です。頭のてっぺんから (私は専門家ではありません)、おそらくタグが見つかるまで文字列をスキャンしたいと思うでしょう。(タグを認識することは、正規表現にとって良いタスクかもしれません。) それが開始タグである場合は、それをスタックにプッシュします。終了タグの場合は、スタックをポップし、終了タグが開始タグと一致することを確認し、これまでに見た文字列を適切な HTML でラップします。これはうまくいかないか、複雑すぎるかもしれません。


1: 100% 確信があるわけではありませんが、これまで見た正規表現の対応する括弧の一致の例は Perl だけで、JavaScript では実行できない Perl コードが埋め込まれていました。いずれにせよ、それはお勧めできません — 作業をより複雑にするツールを使用しようとしています.)

于 2010-12-19T02:11:57.170 に答える