【问题标题】:Javascript Making BBcode regex ungreedyJavascript 使 BBcode 正则表达式变得不贪婪
【发布时间】:2023-03-12 19:21:01
【问题描述】:

感谢另一个问题:removing BBcode from textarea with Javascript
我设法创建了这个: 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),但它只删除了最深的引用的内容,或者它会看到的最后一个引用。我认为这样做的原因是正则表达式是贪婪的。但我试图通过添加? 使其不贪心,但我没有工作:http://jsfiddle.net/hVgAh/2/

我需要删除所有引号及其内容。我该怎么做?

【问题讨论】:

标签: javascript regex bbcode phpbb3


【解决方案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

【讨论】:

  • 谢谢!这很好用!从那以后我已经更改了我的代码,这甚至暴露了其中的一个错误,这并不好。
【解决方案2】:

问题不在于贪婪,而是即使使用 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/

【讨论】:

    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多