JavaScript:查找嵌套[quote]

时间:2010-11-26 08:06:01

标签: javascript jquery validation nested bbcode

我想在用户端使用JavaScript进行表单验证(也使用jQuery)。目标是删除比第2级更深的嵌套bbCode [quote]标签。说,我们有这样的文字:

[quote=SoundMAX][quote=Laplundik][quote=SoundMAX]
blahblahblah[/quote]
blahblah
[/quote]
blah[/quote]

得到这个:

[quote=SoundMAX][quote=Laplundik]
blahblah
[/quote]
blah[/quote]

我唯一的想法是.replace [quote]<div>,然后创建DOM对象并使用jQuery删除任何深于2的内容,并向后解析所有bbCode。但是这个解决方案似乎太复杂了,有更优雅的解决方案吗?

修改

感谢您提供优质的解决方案。根据darioo的回答,我这样做了:

var text=$('#edit-privatemsgbody').val();
var tmp=[];
var level=0;

for (var i=0,l=text.length;i<l;i++){
 if(text[i]=='['&&text[i+1]=='q') level++; 
 if(text[i-6]=='q'&&text[i-7]=='/'&&text[i-8]=='[') level--;
 if(level<3) tmp.push(text[i]);
}
alert(tmp.join(''));

哪种方法很好。

但理想机器的解决方案就像闪光灯一样。我以前不知道替换回调函数参数,现在这很方便!我会满意的。

2 个答案:

答案 0 :(得分:2)

实际上,如果将其视为无法处理嵌套本身的有限工具,则可以使用正则表达式。 .replace字符串方法可以调用函数来查找每个匹配的替换文本,这样我们就可以跟踪我们在标记结构中的深度(代码也发布在http://jsfiddle.net/Zbgr3/3/):

var quoteLevel = 0;

alert(s.replace(/\[(\/?)quote[^\]]*\]|./gi, function(tag, slash) {
    // Opening tag?
    if(tag.length > 1 && !slash.length) quoteLevel += 1;
    // What to strip
    var strip = quoteLevel > 2;
    // Closing tag?
    if(tag.length > 1 && slash.length) quoteLevel -= 1;

    if(strip) return '';
    return tag;
}));

如果你想对标记中的错误有一些容忍度,你可以添加一些额外的代码,例如,防止quoteLevel低于零。

答案 1 :(得分:1)

使用常规数组作为堆栈。每次遇到[quote]时,都会使用push()方法将数组增加一个。遇到[/quote]时,请使用pop()方法将数组减一。

如果您遇到[quote]且数组长度为2,请移除[quote],然后移除您遇到的下一个[/quote]

如果您没有相同数量的打开和关闭引号,那么您必须以您认为合适的方式处理它。