2013-06-12 3 views
1

http://jsfiddle.net/XwHA6/JavaScript заменить(), кажется, только захватить первый удар

У меня есть строка {{значение}} дважды в заданной строке. Когда я пытаюсь заменить() это значение, заменяется только первый экземпляр этого значения, а не второй. Приведенная выше ссылка JSFiddle демонстрирует это. Является ли это «работает как разработанный», или я делаю что-то неправильно? Есть ли лучший вариант?

var str = 'Spend $ {{value}} Get $ {{value}} Off'; 
    var result = str.replace('{{value}}', '<a href="#" id="value" data-type="text" data-pk="1" data-name="Value" data-original-title="Amount" class="editable editable-click">value</a>'); 

ответ

3

Это поведение по умолчанию .replace() со строковым аргументом (по некоторым причинам). Обеспечить регулярное выражение с глобальным флагом, и он будет работать:

str.replace(/{{value}}/g, ...); 

Кроме того, так как я писал один в любом случае, вот простой JavaScript клон str.format Пайтона:

String.prototype.format = function() { 
    if (!arguments.length) { 
     return this; 
    } 

    var mapping; 

    if (typeof arguments[0] === 'object') { 
     mapping = arguments[0]; 
    } else { 
     mapping = arguments; 
    } 

    return this.replace(/\{(.*?)\}/g, function(match, name) { 
     return mapping[name]; 
    }); 
}; 

Вы можете использовать его как так:

str.format({value: '<a href=...'}); 

Или как:

'{0}{1}{0}'.format(1, 2); // "121" 
Смежные вопросы