Строка jQuery заменяет сопоставленное регулярное выражение - PullRequest
3 голосов
/ 21 декабря 2011

Я пытаюсь отформатировать весь столбец таблицы, заменив данные в каждой ячейке строкой.Проще говоря, если я введу «nargles» в поле ввода и нажму кнопку форматирования в верхней части столбца таблицы, текст в каждой ячейке в этом столбце будет заменен на «nargles».Это работает нормально.

Мой вопрос заключается в замене экземпляров "% 0", "% 1", "% 2" и т. Д. Во входной строке значениями таблицы.% 0 соответствует 0-му столбцу,% 1 для 1-го столбца,% 2 для 2-го и т. Д. Кроме того, он должен получить значение столбца для текущей изменяемой строки.

Для пояснения с примером, давайте возьмем таблицу:

1    cat     description
2    dog     description
3    fish    description

Если я введу «Строка% 0 для% 1» для моего ввода и выполню его в 3-м столбце, результат будет:

1    cat     Row 1 is for cat
2    dog     Row 2 is for dog
3    fish    Row 3 is for fish

Надеюсь, это достаточное объяснение =)

Итак, вот пример из таблицы примеров:

<tr>
    <td></td>
    <td><button class="format" col="1">Format Col</button></td>
    <td><button class="format" col="2" >Format Col</button></td>
</tr>

<tr>
    <td><input type="text" col="0" row="0" value="0" size="1"></td>
    <td><input type="text" col="1" row="0" value="cat" /></td>
    <td><input type="text" col="2" row="0" value="description" /></td>
</tr>

...

, а вот код кнопки форматирования вверху каждогоcolumn

$('td button.format').on('click', function () {

    // get formatter variables and column number
    string = $("#formatter").attr("value");
    column = $(this).attr("col");

    // regex to globally look for %d (where d is an integer)
    var re = new RegExp("\%(\\d+)", "g");

    $('td input[col="' + column + '"]').each(function (row) {
        // replace string here
    });
});

В настоящее время эта структура кода будет захватывать значения 1-го столбца и работает нормально

$('td input[col="' + column + '"]').each(function (i) {
    $(this).attr("value", string.replace(re, $('td input[col="1" row="' + i +'"]').attr('value')));
});

Но выполнение чего-то подобного (с вводом "% 2") приведет к"неопределенное 2".(Я заменил col="1" выше на col="\$1" и добавил «\ $ 1», чтобы использовать первое найденное соответствующее регулярное выражение).Я должен также отметить, что в дополнение к «\ $ 1» я использовал «$ 1» и «\ $ 1» без удачи.

$('td input[col="' + column + '"]').each(function (i) {
    $(this).attr("value", string.replace(re, $('td input[col="\$1" row="' + i +'"]').attr('value') + " \$1"));
});

Мой вывод состоит в том, что время, в которое совпадение с регулярным выражением подставляется вJQuery поиск и время, когда поиск выполняется не правильно.Поскольку результат равен «undefined 2», я знаю, что регулярное выражение совпадает, но поиск неверен.Тем не менее, я знаю, что код в целом правильный, так как жесткое кодирование col="2" будет работать.

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

Sidenote: Этого можно было бы избежать, если бы я просто использовал функцию re.match() и перебрал возвращаемый массив.Я знаю, что решение существует, я просто смотрю, есть ли более элегантный / более чистый способ сделать это.

Я знаю, что это долго, извините!Я считаю, что больше информации лучше, чем недостаточно.Спасибо за прочтение до конца!

1 Ответ

5 голосов
/ 21 декабря 2011

Я думаю, вы ищете что-то вроде этого:

 $('td button.format').click(function () {
     var template = "Row %0 is for %1";
     var col = $(this).attr("col");

     $("#body tr").each(function() {
         var $row = $(this);
         var t = template.replace(/%(\d+)/g, function($0, $1) {
             return $row.find("td:eq(" + $1 + ") input").val();
         });
         $row.find("td:eq(" + col + ") input").val(t)
     })
 })

Полный пример: http://jsfiddle.net/TTjtU/

...