替换多个字符串

时间:2011-09-26 11:33:50

标签: javascript jquery string

我有一个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:也欢迎其他解决方案。

3 个答案:

答案 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);
}