替换字符串中的n个模式

时间:2014-06-06 08:45:27

标签: javascript regex replace

是否有一种简单的方法来修复此代码:

title_1 = $(this).closest('tr').find('td').html();
title_2 = $(this).closest('tr').find('td').next().html();
title_3 = $(this).closest('tr').find('td').next().next().html();

question = question.replace(/{title_1}/g, title_1);
question = question.replace(/{title_2}/g, title_2);
question = question.replace(/{title_3}/g, title_3);

所以它不是那么愚蠢(重复)并且可以涵盖 n title_模式的出现?

我是一名初学者Javascript开发人员和一个完整的正则表达式新手(实际上,他们吓唬我!:|),所以我自己无法做到这一点。我已look an inspiration尝试different languages,但失败了。

4 个答案:

答案 0 :(得分:2)

String.prototype.replace() 可以将函数作为第二个参数。

var $this = $(this);
question = question.replace(/\{title_(\d+)\}/g, function(match, n) {
  return $this.closest('tr').find('td').eq(n - 1).html();
});

答案 1 :(得分:2)

您可以在替换中使用函数,以根据您找到的内容获取值:

question = question.replace(/{title_(\d+)}/g, $.proxy(function(x, m){
  return $(this).closest('tr').find('td:eq('+(m-1)+')').html();
}, this));

演示:http://jsfiddle.net/n3qrL/

答案 2 :(得分:1)

Demo Here

试试这个, 广义用于获取所有td标记的文本值:

$("table").find("tr").each(function(){

 $(this).find("td").each(function(){
     alert($(this).html());
     var txt=$(this).html();
     //var pattern="/{"+txt+"}/g";
     //question = question.replace(pattern, txt);
 });
});

NB。在你的问题中,你没有提到'问题'的价值。请为'问题'定义值

答案 3 :(得分:1)

在我看来,你想要获取表格行的前三个单元格的文本内容并用它来替换字符串的内容,并且 this 是某个元素的某个元素排。所以你可以这样做:

var n = 3;  // number of cells to get the text of
var textArray = [];
var tr = $(this).closest('tr')[0];
var reString;

for (var i=0; i<n; i++) {
  reString = '{title_' + (i+1) + '}';
  question = question.replace(reString, tr.cells[i].textContent);
}

如果你想避免jQuery的最近,你可以使用一个简单的函数,如:

function upTo(el, tagName) {
  tagName = tagName.toLowerCase();
  do {
    el = el.parentNode;
    if (el.tagName && el.tagName.toLowerCase() == tagName) {
      return el;
    }
  } while (el.parentNode)
}

然后:

var tr = upTo(this, 'tr');