如何在更换字符串时注意重复?

时间:2017-06-20 05:18:45

标签: javascript jquery json

我遇到一个问题,我需要用一些HTML替换所选文本以获取注释功能。我到达取代文本。但现在问题是文档可能包含重复的字符串,当我尝试替换它时,它总是替换段落中的第一个实例。我的代码在下面给出。

需要从各个位置的json替换所有注释。任何人都可以帮我解决如何在精确位置替换/插入文本吗?

for (var i = 0; i < AnnotationDetails.length; i++)
        {
            //locate the string between start and end point
            var TextToReplace = OutPutText.substring(AnnotationDetails[i].start, AnnotationDetails[i].end);
            //prepare replace text
            var AnnotationClass = '<mark data-entity="' + AnnotationDetails[i].label + '" data-id="' + AnnotationDetails[i]._id + '">' + TextToReplace + '</mark>';
            var AnnotationText = $('.output').html();
            //put text back as html to div
            $('.output').html(AnnotationText.replace(TextToReplace, AnnotationClass));
        }

下面给出了json。

"annotations": [
        {
            "_id": "FWFpjaec",
            "start": "6123",
            "end": "6155",
            "label": "support"
        }
    ]

我有段落字符串&#34;规划和保护联盟&#34;可在两个地方找到。所以每当我尝试替换第二个实例时,javascript总是替换第一个实例。 json中的起点和终点是精确的,但任何方法都可以在精确的位置替换它?

1 个答案:

答案 0 :(得分:0)

如果我理解正确你有正则表达式问题。 String.replace 该方法可以接受正则表达式以及第一个参数。

因为我不知道你的代码中textToReplace是什么,所以我会向你展示更好的理解。

const q=el=>document.querySelector(el);//dont mind this line

const txt=q("div").innerText;
console.log(txt)//test test test

const strOne=txt.replace("test","hey")//this will change the first one only
q("#stringAsFirstParam").innerText=strOne

const regexOne=txt.replace(/test/g,"hey")//i set the global flag as well so it wont stop afther the first match

q("#regexAsFirstParam").innerText=regexOne
<div>test test test</div>

<div id="stringAsFirstParam"></div>
<div id="regexAsFirstParam"></div>
所以只需运行代码段来理解并检查代码

由于您要求更换特定事件,我只准备了另一个片段,请查看

 const q=el=>document.querySelector(el);//dont mind this line

const txt=q("div").innerText;
console.log(txt)//test test test

const strOne=txt.replace("test","changed");//this will change the first one only
q("#stringAsFirstParam").innerText=strOne

const regexOne=txt.replace(/test/g,"changed");//i set the global flag as well so it wont stop afther the first match

q("#regexAsFirstParam").innerText=regexOne

let count=0
const WhichOneDoINeed=2
let current=0
const secondOnly= txt.replace(/test/g,function(match){
  if (++current==WhichOneDoINeed){
    return "changed"
  }
  return match
  
})
q("#secondOnly").innerText=secondOnly
<div>test test test</div>

<div id="stringAsFirstParam"></div>
<div id="regexAsFirstParam"></div>
<div id="secondOnly"></div>