1

感谢另一个问题:使用 Javascript 从 textarea 中删除 BBcode
我设法创建了这个:http: //jsfiddle.net/hVgAh/1/

 text = $('textarea').val();
while (text.match(/\[quote.*\[\/quote\]/i) != null) {
   //remove the least inside the innermost found quote tags 
   text = text.replace(/^(.*)\[quote.*?\[\/quote\](.*)$/gmi, '\$1\$2');
}
text = text.replace(/\[\/?[^\[\]]+\]/gmi,'');
// now strip anything non-character
//text = text.replace(/[^a-z0-9]/gmi, '');
  char = text.length;
  $('div').text(text);

此代码确实删除了引用 bbcode(以及其他 BBcode),但它只删除了最深的引用的内容,或者它会看到的最后一个 qoute。我认为这样做的原因是正则表达式是贪婪的。但我试图通过添加使其不贪婪,?但我没有工作:http: //jsfiddle.net/hVgAh/2/

我需要删除所有引号及其内容。我怎样才能做到这一点?

4

2 回答 2

1

无需去除换行符:要匹配包括换行符在内的任何字符,请使用[\s\S]而不是..

也不需要多行修饰符m,它使锚标记匹配一行的开头^$结尾而不是整个字符串。

这是一个也可以避免重复match调用的解决方案:

var t;
while ( t != text ) {
    t = text;
    //text = text.replace( /\[quote(?:(?!\[quote)[\s\S])+?\[\/quote\]/g, '' );
    text = text.replace( /^([\s\S]*)\[quote[\s\S]+?\[\/quote\]/g, '$1');
}

注释掉的行是一个替代版本,应该同样有效。

它不是贪婪匹配,而是使用负前瞻来确保只匹配最深的引用标签。它用括号括起来,[\s\S]以便在匹配引号标记之间的每个字符之前向前看,如果[quote出现则阻止匹配。

很难说哪个更有效率。

请参阅JSFIDDLE

于 2013-02-19T19:55:07.420 回答
0

m问题不在于贪婪,而是即使使用修饰符,替换也没有超出换行符。我什么都没有替换换行符,所以整个 textarea 变成了一行,突然间它就像一个魅力。

text = $('textarea').val();
text = text.replace(/(\r\n|\n|\r)/gmi, '');
while (text.match(/\[quote.*\[\/quote\]/i) != null) {
    //remove the least inside the innermost found quote tags 
    text = text.replace(/^(.*)\[quote.*?\[\/quote\](.*)$/gmi, '\$1\$2');
}
text = text.replace(/\[\/?[^\[\]]+\]/gmi, '');
text = text.replace(/[^a-z0-9]/gmi, ''); 

http://jsfiddle.net/NaGeL182/dJvuZ/

于 2013-02-19T15:34:40.970 回答