常見的錯誤
此頁面上的幾乎所有答案都使用累積替換,因此在替換字符串本身可以替換時會遇到相同的缺陷。以下是這種模式失敗的幾個例子(h / t @KurokiKaze @derekdreery):
function replaceCumulative(str, find, replace) {
for (var i = 0; i < find.length; i++)
str = str.replace(new RegExp(find[i],"g"), replace[i]);
return str;};// Fails in some cases:console.log( replaceCumulative( "tar pit", ['tar','pit'], ['capitol','house'] ) );console.log( replaceCumulative( "you & me", ['you','me'], ['me','you'] ) );解
function replaceBulk( str, findArray, replaceArray ){
var i, regex = [], map = {};
for( i=0; i<findArray.length; i++ ){
regex.push( findArray[i].replace(/([-[\]{}()*+?.\\^$|#,])/g,'\\$1') );
map[findArray[i]] = replaceArray[i];
}
regex = regex.join('|');
str = str.replace( new RegExp( regex, 'g' ), function(matched){
return map[matched];
});
return str;}// Test:console.log( replaceBulk( "tar pit", ['tar','pit'], ['capitol','house'] ) );console.log( replaceBulk( "you & me", ['you','me'], ['me','you'] ) );注意:
這是@ elchininet的更加兼容的變化的解決方案,它使用map()和Array.indexOf(),因而不會在IE8和更早的版本。
@ elchininet的實現對PHP來說更真實str_replace(),因為它還允許字符串作為查找/替換參數,并且如果有重復項將使用第一個查找數組匹配(我的版本將使用最后一個)。我在這個實現中沒有接受字符串,因為這個案例已經由JS的內置處理了String.replace()。