0

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

[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(''));

哪个工作得很好。

但是idealmachine的解决方案就像是闪现。之前不知道replace回调函数参数,现在好用!我会解决的。

4

2 回答 2

2

实际上,如果您将正则表达式视为无法处理嵌套本身的有限工具,则可以使用它。string 方法可以调用一个函数来查找每个匹配项的.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 低于零。

于 2010-11-26T09:15:15.493 回答
1

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

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

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

于 2010-11-26T08:26:36.413 回答