JavaScript:查找嵌套[引用]

标签 javascript jquery validation nested bbcode

我想用 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/

相关文章:

java - Struts2 中什么时候真正需要自定义 validator ?

python - 如何验证并知道一个 URL 是否是 Google Docs URL? | python , flask |

javascript - 在 JSX 中如何从 DatePicker 重定向 Handlesubmit?

javascript - 在普通 js 中提交表单不会触发 jquery 附加的事件

javascript - 如何通过纯 NodeJS 从 MongoDB 读取数据?

jquery - 在内容编辑器中使用 JQuery1.4min 替换 SharePoint 中的 div 类

javascript - 如何使用 val() 与 js 和 jquery 获取输入值

forms - Chrome HTML5 表单验证问题

javascript - "$75.00"转换为 "75.00"JQuery 或 Javascript

javascript - 我如何根据我的 YML 构建文件在 Javascript 中要求不同的模块?