Javascript使BBcode regex ungreedy
感谢另一个问题:Javascript使BBcode regex ungreedy,javascript,regex,bbcode,phpbb3,Javascript,Regex,Bbcode,Phpbb3,感谢另一个问题: 我成功地创建了这个: 此代码确实删除了quote bbcode(以及其他bbcode),但它只删除了最深的quote或它将看到的最后一个qoute的内容。我认为这是因为正则表达式是贪婪的。但我试图通过添加?使其不贪婪,但我没有成功: 我需要删除所有引用及其内容。我该怎么做呢?问题不在于贪婪,但即使使用m修饰符,替换也没有超出换行的范围。我把新词换成了零行,所以整个文本区变成了一行,突然之间,它就像一个符咒 text = $('textarea').val(); text =
我成功地创建了这个: 此代码确实删除了quote bbcode(以及其他bbcode),但它只删除了最深的quote或它将看到的最后一个qoute的内容。我认为这是因为正则表达式是贪婪的。但我试图通过添加
?
使其不贪婪,但我没有成功:
我需要删除所有引用及其内容。我该怎么做呢?问题不在于贪婪,但即使使用
m
修饰符,替换也没有超出换行的范围。我把新词换成了零行,所以整个文本区变成了一行,突然之间,它就像一个符咒
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, '');
问题不在于贪婪,但即使使用
m
修饰符,替换也没有超出换行的范围。我把新词换成了零行,所以整个文本区变成了一行,突然之间,它就像一个符咒
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, '');
不需要删除换行符:要匹配任何字符(包括换行符),请使用
[\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
时阻止匹配
很难说哪个更有效
请参阅。无需删除换行符:要匹配包括换行符在内的任何字符,请使用
[\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
时阻止匹配
很难说哪个更有效
看到了。谢谢!这很好!从那以后我更改了代码,这甚至暴露了一个错误,这不好。谢谢!这很好!从那以后我更改了代码,这甚至暴露了一个错误,这不好。