0

div に変換したい文字列がありますが、div を適切に閉じません。

私が使用している文字列の例は次のとおりです。

[quote]Quote by: user1 [quote]Quote by: user2 ads[/quote]Test[/quote]Testing 2.

これにより、次の結果が得られます。

<div class="quote" style="margin-left:10px;margin-top:10px;">
  Quote by: user1 
  [quote]Quote by: user2 ads
</div>
  Test[/quote]Testing 2.

ただし、内部引用符は正しく変換されません。

私のJavascript関数は次のようなものです:

function bbcode_parser(str) {
search = new Array(
  /\[b\](.*?)\[\/b\]/g,  
  /\[i\](.*?)\[\/i\]/g,
  /\[quote](.*?)\[\/quote\]/g,
  /\[\*\]\s?(.*?)\n/g);

replace = new Array(
      "<strong>$1</strong>",
      "<em>$1</em>",
      "<div class='quote' style='margin-left:10px;margin-top:10px;'>$1</div>");

for (i = 0; i < search.length; i++) {
    str = str.replace(search[i], replace[i]);
}

return str;
}

JSFiddle実際の動作を確認できるように、http: //jsfiddle.net/gRaFW/2/を用意しました。

助けてください :)

4

3 に答える 3

2

だから...あなたのメソッドは近いですが、JavaScriptの置換機能の仕組みにより、最初のオープンと最初のクローズのペアのみを置き換えます。最初のクローズ後にオープン/クローズのインスタンスがないため、replace メソッドはそこで停止します。検索方法の考え方は次のとおりです。

[quote]Quote by: user1 [quote]Quote by: user2 ads[/quote]Test[/quote]Testing 2.
^ Found open, look for close.....................^ Found! Look for open........

クローズ後にオープンがないため、そこで停止して置換を実行します。

[quote]Quote by: user1 [quote]Quote by: user2 ads[/quote]

になります:

<div class='quote'>Quote by: user1 [quote]Quote by: user2 ads</div>

そして今、文字列全体が次のようになります。

<div class='quote'>Quote by: user1 [quote]Quote by: user2 ads</div>Test[/quote]Testing 2.

この不一致のタグのペアが表示されており、おかしく表示されています。しかし、同じ置換を再度実行すると、最初の置換の開始は 2 番目の置換の終了と一致し、その逆も同様です。奇妙ですが、HTML には各終了タグに対して 1 つの開始タグがあることが保証されます。これは、入力がそうでない場合でも、驚くべきことですが、望ましい結果です。例を続けるには:

<div class='quote'>Quote by: user1 [quote]Quote by: user2 ads</div>Test[/quote]Testing 2.
                                   ^ Found Open, look for close........^ Found! .........

そして今置き換えます:

[quote]Quote by: user2 ads</div>Test[/quote]

<div class='quote'>Quote by: user2 ads</div>Test</div>

文字列全体を取得するには:

<div class='quote'>Quote by: user1 <div class='quote'>Quote by: user2 ads</div>Test</div>Testing 2.

これはまさにあなたが望んでいたものです。これは奇妙で少しハックな方法ですが、使用できる他の方法よりも HTML の方が安全です。

私はあなたのjsfiddleに簡単な変更を書きました。これは、連続した置換が同じ文字列になるまで置換を繰り返すだけです: http://jsfiddle.net/gRaFW/6/

このメソッドは、ネストされたタグだけでなく、連続したタグでも機能することに注意してください。タグが一致しない場合、これ機能しなくなり、より複雑なロジックまたはライブラリが役立ちます。これにより、開始タグと終了タグの 2 つのタグが生成されますが、これらのタグが互いに一致する保証はありません。次に例を示します。

[b][quote]Broke[/b][/quote]

ので注意してください

于 2013-07-01T05:03:20.930 に答える
0

正規表現を使用して HTML を正しく解析できないのと同じ理由で、正規表現のみを使用して BBCode を正しく解析することはできません。BBCode パーサー関数は機能しません。

于 2013-07-01T03:58:15.143 に答える
0

数年前に試みましたが、正規表現で「解析」しようとすると複雑になるため、複雑なネストされたタグでは失敗します: https://github.com/kaimallea/bbcode

また、ここでフロントエンドをまとめました: http://jsfiddle.net/Kai/nJdXF/[quote="Someone"]Hello, there![/quote] -テストのようなものに貼り付けてみてください。

ここで引用に使用したロジックを確認できます: https://github.com/kaimallea/bbcode/blob/master/bbcode.js#L83-L94

とはいえ、最良の結果を得るには、実際のパーサーを調べてみてください。これは単純なものには機能しますが、ネストが狂ってしまうと失敗します。(たとえば、PHP を使用している場合、PHP の BBCode 拡張機能がここにあります: http://php.net/manual/en/book.bbcode.php )

于 2013-07-01T04:17:55.463 に答える