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 的替换功能的工作方式,它只会替换第一个打开和第一个关闭对。由于第一次关闭后没有打开/关闭实例,因此替换方法停止。以下是搜索方法的思考方式:

[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.

这对不匹配的标签就是您所看到的,并且显示很有趣。但是如果你再次执行相同的替换,第一个替换的打开将匹配第二个替换的关闭,反之亦然。奇怪,但它确实确保 HTML 的每个结束标记都有一个打开标记,即使输入没有,这是一个令人惊讶但又令人满意的结果。继续这个例子:

<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

单独使用正则表达式无法正确解析 BBCode,原因与使用正则表达式无法正确解析 HTML相同。您的 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 回答