一次replace多个string

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

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

这是使用PHP的str_replace ,它允许您使用一个单词的数组来查找和replace。 我可以使用JavaScript / jQuery做这样的事吗?

 ... var textarea = $(this).val(); // string replace here $("#output").html(textarea); ... 

你可以用你自己的函数来扩展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; }; 

对于全局replace,你可以使用正则expression式:

 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 = ["&lt;", "&gt;", "<br/>"]; textarea = textarea.replaceArray(find, replace); 
 text = text.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br/>'); 

更直观的方法:

 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]; }); }; 

这就是你所说的:

 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; 

常见的错误

几乎所有的答案在这个页面上使用累积replace,因此遭受同样的缺陷,replacestring本身可能会被replace。 这里有几个例子,这种模式失败(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'] ) ); 

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

第一种方法(使用查找和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]}); 

的jsfiddle

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

 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)]}); 

的jsfiddle

期望的function:

 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); 

编辑

这个function允许一个StringArray作为参数:

 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)]}); } 

你可能想看看一个名为phpJS的JS库。

它允许你使用str_replace函数,类似于你将如何在PHP中使用它。 还有更多的PHPfunction“移植”到JavaScript。

http://phpjs.org/functions/str_replace:527

对于标签,您应该能够使用.text()而不是.html()来设置内容。

例如: http : //jsfiddle.net/Phf4u/1/

 var textarea = $('textarea').val().replace(/<br\s?\/?>/, '\n'); $("#output").text(textarea); 

…或者如果你只是想删除<br>元素,你可以摆脱.replace() ,并暂时使他们的DOM元素。

例如: http : //jsfiddle.net/Phf4u/2/

 var textarea = $('textarea').val(); textarea = $('<div>').html(textarea).find('br').remove().end().html(); $("#output").text(textarea); 
 String.prototype.replaceArray = function (find, replace) { var replaceString = this; for (var i = 0; i < find.length; i++) { // global replacement var pos = replaceString.indexOf(find[i]); while (pos > -1) { replaceString = replaceString.replace(find[i], replace[i]); pos = replaceString.indexOf(find[i]); } } return replaceString; }; var textT = "Hello world,,,,, hello people....."; var find = [".",","]; var replace = ['2', '5']; textT = textT.replaceArray(find, replace); // result: Hello world55555 hello people22222 

在一个方法调用中没有办法做到这一点,你必须将调用链接在一起,或者写一个手动完成你所需要的function。

 var s = "<>\n"; s = s.replace("<", "&lt;"); s = s.replace(">", "&gt;"); s = s.replace("\n", "<br/>"); 

一种方法是:

 var text = $(this).val(); text = text.replace(/</g, "&lt;").replace(/>/g, "&gt;"); $("#output").html(text); 

这是一个简单的基于地图的方法。 stringreplace比正则expression式replace速度快95%。

 function strReplaceMap(str, map) { for (var search in map) { str = str.replace(search, map[search]); } return str; } 

这是一个比较这与正则expression式的基准 。

我有一个情况,我不得不从一个string中删除字符,并像这样做:

  let badChars = ['å', 'ä', 'ö']; let newName = fileName.split("").filter((chr) => badChars.indexOf(chr) === -1).join(""); 

如果string本质上是JavaScript中的字符数组,那么我们就不需要那些split / join,就像newName = fileName.filter((chr) => badChars.indexOf(chr) === -1)但是我仍然认为如果你只需要处理字符而不是处理string,那么它就是整洁可读的。