Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript使BBcode regex ungreedy_Javascript_Regex_Bbcode_Phpbb3 - Fatal编程技术网

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
时阻止匹配

很难说哪个更有效


看到了。

谢谢!这很好!从那以后我更改了代码,这甚至暴露了一个错误,这不好。谢谢!这很好!从那以后我更改了代码,这甚至暴露了一个错误,这不好。