【问题标题】:JavaScript: Find nested [quote]JavaScript:查找嵌套 [quote]
【发布时间】:2010-11-26 08:06:01
【问题描述】:

我想在用户端使用 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]

我唯一的想法是将 [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回调函数参数,现在好用!我会解决的。

【问题讨论】:

标签: javascript jquery validation nested bbcode


【解决方案1】:

实际上,如果您将正则表达式视为无法处理嵌套本身的有限工具,则可以使用它。 .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 低于零。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多