我有一个XML文件,其中包含某种语言的文本,我需要遍历它并翻译某些表达式。我在考虑创建一个包含表达式的数组和一个包含替换的数组:
var searchFor = ['Foo', 'Bar'];
var replaceWith = ['Bar', 'Foo'];
我是否可以通过某种方式有效地遍历XML,将第一个数组中的所有项目替换为下一个?
xml.each(function(){
$(this).text($(this).text().multiReplace(searchFor, replaceWith));
});
我正在寻找的是一个javascript函数,相当于PHP函数str_replace,它可以为第一个和第二个参数接收数组: http://php.net/manual/en/function.str-replace.php
“FooBar'.multiReplace(searchFor,replaceWith); //应该返回'BarFoo'
PS:也欢迎其他解决方案。
答案 0 :(得分:1)
对于一个非常简单的实现,因为你有jQuery,你可以在回调中使用$ .each:
var txt = $(this).text();
$.each(searchFor, function(i,v){
txt.replace(v, replaceWith[i]);
});
$(this).text(txt);
如果要交换值,则必须插入您确定字符串中不存在的标记。 例如,'## i ##'。 (在字符串中搜索正则表达式'## \ d + ##'。如果存在,则添加封闭'#'并再次搜索,直到找到您知道字符串中不存在的标记。)
var txt = $(this).text();
var tokens = [];
$.each(searchFor, function(i,v){
var token = "##" + i + "##";
tokens.push(token);
txt.replace(v, token);
});
$.each(tokens, function(i,v){
txt.replace(v, searchFor[i]);
});
$(this).text(txt);
答案 1 :(得分:1)
我找到了一个似乎工作正常的解决方案。我使用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"
答案 2 :(得分:0)
我已经拥有这个功能〜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);
}