Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 替换多个字符串_Javascript_Jquery_String - Fatal编程技术网

Javascript 替换多个字符串

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

我有一个包含特定语言文本的XML文件,我需要遍历它并翻译特定的表达式。我正在考虑创建一个包含表达式的数组和一个包含替换项的数组:

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"