我想用 JavaScript 在用户端进行表单验证(也使用 jQuery)。目标是删除嵌套的 bbCode [quote]
标签比级别 2 更深。比如说,我们有这样的文本:
[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。但这个解决方案似乎太复杂了,有没有更优雅的解决方案?
编辑:
感谢您提供好的解决方案。根据达里奥的回答,我这样做了:
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
string 方法可以调用一个函数来查找每个匹配的替换文本,这使我们能够跟踪标记结构的深度(代码也发布在 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 低于零。
关于JavaScript:查找嵌套[引用],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4283474/