我想在用户端使用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(''));
哪种方法很好。
但理想机器的解决方案就像闪光灯一样。我以前不知道替换回调函数参数,现在这很方便!我会满意的。
答案 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]
。
如果您没有相同数量的打开和关闭引号,那么您必须以您认为合适的方式处理它。