一次replace多个string
在JavaScript中有这样一个简单的等价物吗?
$find = array("<", ">", "\n"); $replace = array("<", ">", "<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 = ["<", ">", "<br/>"]; textarea = textarea.replaceArray(find, replace);
text = text.replace(/</g, '<').replace(/>/g, '>').replace(/\n/g, '<br/>');
更直观的方法:
String.prototype.htmlProtect = function() { var replace_map; replace_map = { '\n': '<br />', '<': '<', '>': '>' }; 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(); // <b>tell me a story, <br /><i>bro'</i>
常见的错误
几乎所有的答案在这个页面上使用累积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 = {"<" : "<", ">" : ">", "\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 = ["<", ">", "<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
允许一个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)]}); }
你可能想看看一个名为phpJS的JS库。
它允许你使用str_replace函数,类似于你将如何在PHP中使用它。 还有更多的PHPfunction“移植”到JavaScript。
对于标签,您应该能够使用.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("<", "<"); s = s.replace(">", ">"); s = s.replace("\n", "<br/>");
一种方法是:
var text = $(this).val(); text = text.replace(/</g, "<").replace(/>/g, ">"); $("#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,那么它就是整洁可读的。