如何在函数中使用javascript正则表达式反向引用?

时间:2013-06-04 05:25:22

标签: javascript regex backreference

var string = input.replace(/\[noparse\]([^\]]+)?\[\/noparse\]/ig, '<noparse>'+removeBrackets('$1')+'</noparse>');

此表达式应采用字符串并对 [noparse] 标记中包含的部分进行编码,以便它们不会在textarea中呈现。

我测试了这个:

var string = input.replace(/\[noparse\]([^\]]+)?\[\/noparse\]/ig, '<noparse>test</noparse>');

和:

var string = input.replace(/\[noparse\]([^\]]+)?\[\/noparse\]/ig, '<noparse>'+String('$1')+'</noparse>');

他们工作(没有预期的效果)。

function removeBrackets(input){
return input
.replace(/\[/g, '&#91;')
.replace(/\]/g, '&#92;');
}

在尝试将后引用传递给removeBrackets函数时,我做错了什么?

2 个答案:

答案 0 :(得分:2)

replace将函数作为回调并传递参数中的捕获组:

var regex = /\[noparse\]([^\]]+)?\[\/noparse\]/ig;

string = string.replace(regex, function(_, match) {
  return '<tag>'+ removeBrackets(match) +'</tag>';
});

第一个参数_是完整字符串,在大多数情况下是不必要的。

答案 1 :(得分:1)

由于您正在使用的否定字符集中存在错误,因此您的正则表达式将无效。这解决了它:

input.replace(/\[noparse\]([^\[]+)?\[\/noparse\]/ig, '<noparse>test</noparse>');
                              ^

然后,要执行实际替换,您需要将函数作为第二个参数传递给.replace()而不是简单的字符串。