JavaScript replace () регулярное выражение по номеру индекса - PullRequest
4 голосов
/ 05 августа 2010

У меня есть следующая строка и регулярное выражение:

var string = "Dear [to name], [your name] has decided to share this [link]"; 
var patt = /\[+[A-Za-z0-9]+\]/;

Я хочу иметь возможность изменять каждую из переменных в скобках с помощью динамического ввода. Как бы я использовал match() или replace() для нацеливания на первое, второе и третье вхождения этого регулярного выражения?

РЕДАКТИРОВАТЬ: В настоящее время, если я сделаю что-то вроде document.write(body.match(patt));, это будет соответствовать только последний [ссылка]

РЕДАКТИРОВАТЬ: Вся строка берется из значения текстового поля. Значения для каждого из скобок взяты из других текстовых вводов и должны быть вставлены в строку, прежде чем текст будет возвращен в текстовое поле.

Ответы [ 2 ]

10 голосов
/ 05 августа 2010

Используйте функцию в качестве второго аргумента метода replace:

var replacement = { "to name": "Joe", "your name": "Fred", "link": "foo" };

string = string.replace(/\[([^\]]+)\]/g, function (_, group) {
    return replacement[group];
});

О, и причина, по которой ваш шаблон соответствует только тексту [link], заключается в том, что он допускает использование только буквенно-цифровых символов в скобках, а не пробелы.

РЕДАКТИРОВАТЬ: Если содержимое скобок не имеет значения, и вы просто хотите заменить их по порядку, используйте массив вместо хеша:

var replacement = [ "Joe", "Fred", "foo" ];
var index = 0;
string = string.replace(/\[[^\]]+\]/g, function () {
    return replacement[index++];
});
3 голосов
/ 05 августа 2010

Предполагая, что эти элементы в скобках всегда одинаковы, вам не нужно использовать регулярные выражения.

var string = "Dear [to name], [your name] has decided to share this [link]"; 
var name = 'Bob';
var your_name = 'Jacob';
var link = 'http://google.com';

string = string.replace( '[to name]', name ).replace( '[your name]', your_name ).replace( '[link]', link )

alert( string )​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...