2013-06-04 46 views
0

var string = input.replace(/\[noparse\]([^\]]+)?\[\/noparse\]/ig, '<noparse>'+removeBrackets('$1')+'</noparse>');如何在函數中使用javascript正則表達式反向引用?

該表達式應該採取的字符串和編碼包裹在[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;'); 
} 

我在做什麼錯在嘗試將back引用傳遞給removeBrackets函數?

+0

''[^ \]] +'應該是'[^ \ [] +' –

+0

您可能希望將MDN加入書籤供將來參考:https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/String /替換 –

回答

2

replace取一個函數作爲回調並傳遞捕獲組中的參數:

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

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

的第一個參數是_完整的字符串,在大多數情況下是不必要的。

+0

試過這個,它沒有工作。你能解釋一下如何以及爲什麼增加的功能應該起作用? – user1755043

+0

@ user1755043:查看MDN獲取更多信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace – elclanrs

+0

我的問題實際上是我需要使用'([^ \。] *)?'。謝謝你的幫助。 – user1755043

1

由於您使用的否定字符集中存在錯誤,您的正則表達式將無法正常工作。這修復它:

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

然後,執行實際的替代品,你需要通過一個函數作爲第二個參數.replace(),而不是一個簡單的字符串。

+0

對於許多其他表達式,我一直使用'([^ \]] +)?'的語法,它的工作原理是一樣的。這可能是可以接受的,或者是firefox捕捉到我的錯誤嗎? – user1755043

+0

@ user1755043不,你錯了。它應該匹配,直到遇到一個左括號。 –

+0

我的問題其實是我需要使用'([^ \。] *)?'。謝謝你的幫助。 – user1755043

相關問題