Javascript 替换多个字符串
我有一个包含特定语言文本的XML文件,我需要遍历它并翻译特定的表达式。我正在考虑创建一个包含表达式的数组和一个包含替换项的数组:Javascript 替换多个字符串,javascript,jquery,string,Javascript,Jquery,String,我有一个包含特定语言文本的XML文件,我需要遍历它并翻译特定的表达式。我正在考虑创建一个包含表达式的数组和一个包含替换项的数组: var searchFor = ['Foo', 'Bar']; var replaceWith = ['Bar', 'Foo']; 是否有某种方法可以有效地遍历XML,用下一个数组替换第一个数组中的所有项 xml.each(function(){ $(this).text($(this).text().multiReplace(searchFor, replac
var searchFor = ['Foo', 'Bar'];
var replaceWith = ['Bar', 'Foo'];
是否有某种方法可以有效地遍历XML,用下一个数组替换第一个数组中的所有项
xml.each(function(){
$(this).text($(this).text().multiReplace(searchFor, replaceWith));
});
我要找的是一个javascript函数,它相当于PHP函数str_replace,可以接受第一个和第二个参数的数组:
“FooBar”.multiReplace(搜索,替换为);//应该返回“BarFoo”
PS:也欢迎其他解决方案。对于一个非常简单的实现,因为您有jQuery,所以您可以使用$。回调中的每个回调:
var txt = $(this).text();
$.each(searchFor, function(i,v){
txt.replace(v, replaceWith[i]);
});
$(this).text(txt);
如果您想交换值,您必须插入您确定字符串中不存在的标记。
例如,“我”。(在字符串中搜索regexp“##\d+###”,如果存在,则添加封闭的“#”,然后再次搜索,直到找到字符串中不存在的标记。)
我有这个功能大约5年了。我不知道我从哪里弄来的
function str_replace (search, replace, subject) {
var result = "";
var oldi = 0;
for (i = subject.indexOf (search); i > -1; i = subject.indexOf (search, i)) {
result += subject.substring (oldi, i);
result += replace;
i += search.length;
oldi = i;
}
return result + subject.substring (oldi, subject.length);
}
我找到了一个似乎很有效的解决方案。我使用multiReplace函数扩展了String对象,该函数将翻译映射作为参数,并返回一个包含替换表达式的新字符串
String.prototype.multiReplace = function(translations){
var regexStr = '';
var result = '';
for(var key in translations){
regexStr += key + '|';
}
regexStr = '(' + regexStr.substring(0,regexStr.length-1) + ')';
var rx = new RegExp(regexStr,'g');
result = this.replace(rx, function(match){
return translations[match.toLowerCase()];
});
return result;
}
var translations = {
'Foo':'Bar',
'Bar':'Foo'
};
text = 'FooBarFooFooBarBarFooBarFooFoo';
text = text.multiReplace(translations);
// text = "BarFooBarBarFooFooBarFooBarBar"
这与/g修饰符,即'FooBar',replace(/Foo/g,'Bar');不一样吗?不知道但它与stru replace的功能相同。如果在搜索和替换参数中发送数组,则不需要这样做:)因此只需进行修改,即检查是否有数组,如果有,则进行相应替换。谢谢,我喜欢此解决方案,但是我希望在不多次搜索文本的情况下实现这一点。如果您的键中有正则表达式特殊字符(如
[
或(
)。谢谢,我没有想到:)一个改进是在multiReplace函数中转义键,但我想我现在就不做了,因为这不会投入生产,我自己控制翻译:)
String.prototype.multiReplace = function(translations){
var regexStr = '';
var result = '';
for(var key in translations){
regexStr += key + '|';
}
regexStr = '(' + regexStr.substring(0,regexStr.length-1) + ')';
var rx = new RegExp(regexStr,'g');
result = this.replace(rx, function(match){
return translations[match.toLowerCase()];
});
return result;
}
var translations = {
'Foo':'Bar',
'Bar':'Foo'
};
text = 'FooBarFooFooBarBarFooBarFooFoo';
text = text.multiReplace(translations);
// text = "BarFooBarBarFooFooBarFooBarBar"