一次更换多个字符串

Tim*_*Tim 63 javascript jquery replace

在JavaScript中有一个简单的等价物吗?

$find = array("<", ">", "\n");
$replace = array("&lt;", "&gt;", "<br/>");

$textarea = str_replace($find, $replace, $textarea); 
Run Code Online (Sandbox Code Playgroud)

这是使用PHP str_replace,它允许您使用单词数组来查找和替换.我可以使用JavaScript/jQuery做这样的事情吗?

...
var textarea = $(this).val();

// string replace here

$("#output").html(textarea);
...
Run Code Online (Sandbox Code Playgroud)

Bob*_*Bob 80

您可以使用自己的函数扩展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;
};
Run Code Online (Sandbox Code Playgroud)

对于全局替换,您可以使用正则表达式:

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;
};
Run Code Online (Sandbox Code Playgroud)

要使用该函数,它将与您的PHP示例类似:

var textarea = $(this).val();
var find = ["<", ">", "\n"];
var replace = ["&lt;", "&gt;", "<br/>"];
textarea = textarea.replaceArray(find, replace);
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不适用于以下情况:字符串:"猫击中狗"找到数组:['cat','dog']替换数组:['dog,'cat'] (5认同)
  • @Tim这是常规JavaScript,不需要额外的库.JavaScript是一种原型语言,这意味着每个对象都有一个继承自的原型.添加到对象的原型只是扩展所有这些对象的一种方法. (3认同)
  • "tar pit".replaceArray(['tar','pit'],['capitol','house'])//"cahouseol house" (3认同)
  • @derekdreery该函数既不适用于包含`RegExp`字符的字符串,例如:find array ["(",")"] replace array ["[","]"] (2认同)

Ste*_*ris 38

常见的错误

此页面上的几乎所有答案都使用累积替换,因此在替换字符串本身可以替换时会遇到相同的缺陷.以下是这种模式失败的几个例子(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'] ) );
Run Code Online (Sandbox Code Playgroud)

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'] ) );
Run Code Online (Sandbox Code Playgroud)

注意:

这是@ elchininet的更加兼容的变化的解决方案,它使用map()Array.indexOf(),因而不会在IE8和更早的版本.

@ elchininet的实现对PHP来说更真实str_replace(),因为它还允许字符串作为查找/替换参数,并且如果有重复项将使用第一个查找数组匹配(我的版本将使用最后一个).我在这个实现中没有接受字符串,因为这个案例已经由JS的内置处理了String.replace().

  • @ StephenM.Harris很酷的回答,您也注意到页面中的几乎所有答案都使用累积替换. (3认同)
  • @MacroMan修复了!不得不更新逃避特殊正则表达式字符的正则表达式(这听起来很容易出错:D).感谢您指出了这一点! (3认同)

hsz*_*hsz 17

text = text.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br/>');
Run Code Online (Sandbox Code Playgroud)

  • 这不是"立刻".与"one-liner"基本相同:text = text.replace(foo); text = text.replace(bar); (6认同)
  • @Beejor公平地说,接受的答案也不是"立刻",它只是隐藏了函数背后的后续替换. (5认同)

ElC*_*Net 10

您可以String在第二个参数中使用对象的replace方法和函数:

第一种方法(使用查找和替换对象)

var findreplace = {"<" : "&lt;", ">" : "&gt;", "\n" : "<br/>"};

textarea = textarea.replace(new RegExp("(" + Object.keys(findreplace).map(function(i){return i.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&")}).join("|") + ")", "g"), function(s){ return findreplace[s]});
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

第二种方法(使用两个数组,查找和替换)

var find = ["<", ">", "\n"];
var replace = ["&lt;", "&gt;", "<br/>"];

textarea = textarea.replace(new RegExp("(" + find.map(function(i){return i.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&")}).join("|") + ")", "g"), function(s){ return replace[find.indexOf(s)]});
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

期望的功能:

function str_replace($f, $r, $s){
   return $s.replace(new RegExp("(" + $f.map(function(i){return i.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&")}).join("|") + ")", "g"), function(s){ return $r[$f.indexOf(s)]});
}

$textarea = str_replace($find, $replace, $textarea);
Run Code Online (Sandbox Code Playgroud)

编辑

function允许一个String或一个Array参数:

function str_replace($f, $r, $s){
    return $s.replace(new RegExp("(" + (typeof($f) === "string" ? $f.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&") : $f.map(function(i){return i.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&")}).join("|")) + ")", "g"), typeof($r) === "string" ? $r : typeof($f) === "string" ? $r[0] : function(i){ return $r[$f.indexOf(i)]});
}
Run Code Online (Sandbox Code Playgroud)


Uto*_*pik 8

更直观的方法:

String.prototype.htmlProtect = function() {
  var replace_map;

  replace_map = {
    '\n': '<br />',
    '<': '&lt;',
    '>': '&gt;'
  };

  return this.replace(/[<>\n]/g, function(match) { // be sure to add every char in the pattern
    return replace_map[match];
  });
};
Run Code Online (Sandbox Code Playgroud)

这就是你怎么称呼它:

var myString = "<b>tell me a story, \n<i>bro'</i>";
var myNewString = myString.htmlProtect();

// &lt;b&gt;tell me a story, <br />&lt;i&gt;bro'&lt;/i&gt;
Run Code Online (Sandbox Code Playgroud)


Jac*_*rst 7

一个简单的forEach循环很好地解决了这个问题:

let text = 'the red apple and the green ball';
const toStrip = ['red', 'green'];
toStrip.forEach(x => {
   text = text.replace(x, '');
});

console.log(text);
// logs -> the apple and the ball
Run Code Online (Sandbox Code Playgroud)


小智 5

最佳答案相当于做:

let text = find.reduce((acc, item, i) => {
  const regex = new RegExp(item, "g");
  return acc.replace(regex, replace[i]);
}, textarea);
Run Code Online (Sandbox Code Playgroud)

鉴于这种:

var textarea = $(this).val();
var find = ["<", ">", "\n"];
var replace = ["&lt;", "&gt;", "<br/>"];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有进行命令式编程。


Nir*_*hal 5

使用 ES6:search对于 string 和replacein , 有很多方法JavaScript。其中之一如下

const findFor = ['<', '>', '\n'];

const replaceWith = ['&lt;', '&gt;', '<br/>'];

const originalString = '<strong>Hello World</strong> \n Let\'s code';

let modifiedString = originalString;

findFor.forEach( (tag, i) => modifiedString = modifiedString.replace(new RegExp(tag, "g"), replaceWith[i]) )

console.log('Original String: ', originalString);
console.log('Modified String: ', modifiedString);
Run Code Online (Sandbox Code Playgroud)