2017-06-20 3 views
1

私は1つの問題を抱えています。注釈機能のために、選択したテキストを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" 
     } 
    ] 

2つの場所で文字列「Planning and Conservation League」を利用できます。だから私は2番目のインスタンスを置換しようとするたびに、javascriptは常に最初のものを置き換えます。 jsonの開始点と終了点は正確ですが、正確な位置に置き換える方法はありますか?

+0

これを試す:https://stackoverflow.com/a/542260/6932518 – Botimoo

+0

リンクありがとうございますが、私の問題は特定の場所で文字列を置き換える必要があることです。私はファイルを読み込んで解析していますが、div内で出力可能です。その後、テキストの一部を選択してアノテーションを適用することができます。しかし、誰かがファイル内で前に利用可能なチャンクを選択したときに問題が発生し、その時にジャバスクリプトは選択されたものの代わりにその最初のオカレンスを置き換えます。 –

答えて

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>

+0

私の問題は、すべてのオカレンスではなく、わずか2番目のオカレンスを置き換える必要があることです。私の現在の機能として、常に最初のオカレンスをHTMLに置き換えています。その第二の発生を完全に無視する。 –

+0

@BhargavBhanderiすぐに答えを更新しています – nikoss

+0

私はこれが役に立ちそうです。 @BhargavBhanderi。それが解決した場合、質問に印を付けてください。 – nikoss

関連する問題