狐的传说
您可以使用自己的函数扩展String对象,该函数可以满足您的需要(如果缺少功能,则非常有用):String.prototype.replaceArray = function(find, replace) {
var replaceString = this;
for (var i = 0; i < find.length; i++) {
replaceString = replaceString.replace(find[i], replace[i]);
}
return replaceString;};对于全局替换,您可以使用正则表达式:String.prototype.replaceArray = function(find, replace) {
var replaceString = this;
var regex;
for (var i = 0; i < find.length; i++) {
regex = new RegExp(find[i], "g");
replaceString = replaceString.replace(regex, replace[i]);
}
return replaceString;};要使用该函数,它将与您的PHP示例类似:var textarea = $(this).val();var find = ["<", ">", "\n"];var replace = ["<", ">", "<br/>"];textarea = textarea.replaceArray(find, replace);
jeck猫
常见的错误此页面上的几乎所有答案都使用累积替换,因此在替换字符串本身可以替换时会遇到相同的缺陷。以下是这种模式失败的几个例子(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()。