2012-12-12 108 views
1

我想重命名克隆功能中的某些字段,但我不知道如何重命名(增加)字段名称。字段名的jQuery搜索替换字符串

var tr = $copy.clone(); 
tr('input').each(function() { 
    console.log(this.name); 
    this.name = something; 
}); 

例子:

field[subform][0][subsubform][2][name] 

在这种情况下,我需要增加[2][3]。名字可以有更多或更少的括号,但它总是我需要增加的倒数第二。

我该如何去做这件事?

+0

请说明更多。 – user197508

+0

将该数字存储在'data-'属性中。 – Blender

+0

不幸的是,由于我使用的是复杂的表单框架,因此无法将其设置为数据属性。这本来是一个好的和简单的解决方案。 – charliexx

回答

0

正则表达式的乐趣。匹配模式[数字] [字符串]结束行,读取数字,加一个,加入匹配的其他部分,并设置新名称。

$(tr).find("input").prop("name", function() { 
    return this.name.replace(
     /\[(\d+)(\]\[[^[]+]$)/, 
     function (a,b,c) { 
      return "[" + (parseInt(b,10)+1) + "]" + c; 
     } 
    ) 
}); 
0

假设它总是会在字符串的结尾先于[...]

name.replace(/\[(\d+)\](\[[^\[]+\])$/, function (pattern, value, tail) { 
    return "[" + (parseInt(value, 10) + 1) + "]" + tail; 
});​ 
+0

如果突然出现更多的括号,这不会起作用吗? – charliexx

+0

@charliexx如果您的模式将发生变化,那么需要更灵活的解决方案。我更新了我的答案,以包含正则表达式。 – Sampson

0

你能做到这样的,如果它始终是第二个最后一个

var name = 'field[subform][0][subsubform][2][name]'; 
var firstStr = name.split('][').slice(0,-2); 
var secStr = name.split('][').slice(-2); 
secStr[0] = +secStr[0] +1; 
console.log(firstStr.concat(secStr).join('][')); 

http://jsfiddle.net/3TuHg/

或类似

var name = 'field[subform][0][subsubform][2][name]'; 
var str = name.split(']['); 
str[str.length - 2] = +str[str.length - 2] + 1; 
str = str.join(']['); 
console.log(str); 

http://jsfiddle.net/NsGvv/

0

使用indexOfsubstr

以下代码获取数字,数字和数字后面的字符串前的字符串的第一部分。然后将数字加1并将所有内容连接起来。

var string = "field[subform][0][subsubform][2][name]", 
    beg = string.indexOf("subsubform][") + 12, 
    end = string.indexOf("]", beg); 
string = string.substr(0, beg) + (parseInt(string.substr(beg, end)) + 1) + string.substr(end); 

demo