regex Jquery/Javascript克隆动态替换ID

apeeds0o  于 2023-03-04  发布在  jQuery
关注(0)|答案(1)|浏览(169)

我有这个样本内容是克隆的,有ID的被替换。

<div id="tabs-1"><div class="ui-widget"> 
    <label for="tags">Wohnort: </label> <input class="tags" id="tags-1" name="tags[]" type="text"/>
</div>
    <input type="hidden" class="hid_id" id="hid_id-1" name="hid_id[]"/><input type="hidden" id="hid_id2-1" class="hid_id2" name="hid_id2[]"/>
<div class="ui-widget"> 
    <label for="jahr">Geburtstag: </label> <input type="text" id="jahr-1" class="jahr dated" name="jahr[]" placeholder="dd.mm.yyyy" pattern="^[a-zA-Z0-9\.]*$" class="dated"/>
</div></div>

获取id的正则表达式可以是

/id="[^"]+-[^"]+"/g

可在此处检查:https://regexr.com/匹配的数组是id=“tags-1”、id=“hid_id-1”等。现在我希望将它们更改为id=“tags-2”、id=“hid_id-2”等。
因此,我不能只是静态地替换,而是应该使用匹配数组Each,拆分并重用第一部分,之后添加新的id。
我的代码得到的id是这样的:(变量new_id预先获得增加的id)

jQuery('#tabs-1').children().clone()
.html(function(i, oldHTML) {
var old_base = oldHTML.split("-");
var new_result = old_base[0]+"-"+ new_ide;
alert(new_result);
var new_html = oldHTML.replace(/id="[^"]+-[^"]+"/g, new_result);
})
.appendTo("#tabs-"+new_id);

当我把匹配放在一个数组中时,我可以这样做:

arr.forEach(myFunction);
myFunction(item, index, arr){
new_var = item.split("-");
new_full_id = new_var[0] +"-"+new_full_id;
}

我怎样才能把这些组合起来做预期的事情?-非常感谢

jdgnovmf

jdgnovmf1#

好的,首先,这个解决方案会正确地工作,但它绝对不是一个万无一失的解决方案;它也不是可读性最好的。理想情况下,您应该将其解析为嵌套的HTMLEelement,并替换格式中的每个id。不过,这里有一个解决方案:

/(?<= id=["'])[^"]+-(\d+)(?=["'])/g

using this link所示,对于每个匹配项,提取最后一个数字,将其递增,然后再加回去,代码如下所示。

let input = `<div id="tabs-1" data-something-id="smth-1"><div class="ui-widget"> 
    <label for="tags">Wohnort: </label> <input class="tags" id="tags-1" name="tags[]" type="text"/>
</div>
    <input type="hidden" class="hid_id" id="hid_id-1" name="hid_id[]"/><input type="hidden" id="hid_id2-1" class="hid_id2" name="hid_id2[]"/>
<div class="ui-widget"> 
    <label for="jahr">Geburtstag: </label> <input type="text" id="jahr-1" class="jahr dated" name="jahr[]" placeholder="dd.mm.yyyy" pattern="^[a-zA-Z0-9\.]*$" class="dated"/>
</div></div>
`
let regex = /(?<= id=["'])[^"]+-(\d+)(?=["'])/g
console.log(input.replaceAll(regex, function(match) {
  let sep = match.split("-")
  let first = sep[0]
  for(let i = 1; i < sep.length-1; ++i) first += "-" + sep[i];
  return first + "-" + (parseInt(sep[sep.length-1])+1)
}))

PS:这将在大多数现代浏览器中工作,但为了安全起见,您应该检查此链接:caniuse.com - Regex Lookbehind

相关问题