Замена нескольких строк - PullRequest
       3

Замена нескольких строк

0 голосов
/ 26 сентября 2011

У меня есть 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 ]

1 голос
/ 26 сентября 2011

Я нашел решение, которое, кажется, работает нормально.Я расширил объект String с помощью функции 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"
1 голос
/ 26 сентября 2011

Для очень простой реализации, поскольку у вас есть 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);
0 голосов
/ 26 сентября 2011

У меня есть эта функция, как ~ 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...