2016-06-02 9 views
1

誰かがそれを助けてくれるのを助けてくれます。Javascriptの検索と置換は文字列で実行されますが、変数ではありません

小さなコンテンツの移行後にSPServicesとJavascriptを使用していくつかのリンクを書き換えています。

私は変数にいくつかのHTMLを持っており、特定のURLである文字列を見つけようとしていて、別のURLに置き換えようとしています。これは動作します:

newHTML = newHTML.replace("http://urlhere/subsite/page.aspx",newLink);

また、この作品:

newHTML = newHTML.replace(new RegExp("http://urlhere/subsite/page.aspx", 'gi'), newLink); 

をしかし、私はそこに同じ文字列を含む変数を持っている場合、それは動作しません:

newHTML = newHTML.replace(new RegExp(oldLink, 'gi'), newLink); 

マイoldLink変数は、 'a'タグをとり、配列に配置するHTMLを含む別のリスト列へのSPServices呼び出しから来ます。

function rewriteLinks() { 
var urlStart = "http://urlstart"; 



var linkContainerArray = []; 


    var theContent = $('.htmlContentDiv').html(); 

    // get a tags 
    var aTags = ('a',theContent); 
    //loop through A tags and get oldLink and Text 
    $(aTags).each(function(){ 

    var ID; 

    var itemTitle = $(this).text(); 

    var oldLink = $(this).attr('href'); 

    var newLink; 

    if(itemTitle.length > 2){ 
     //SpService call to get ID of that item using inner text as query to SharePoint list 

      $().SPServices({ 
      operation: "GetListItems", 
      async: false, 
      CAMLViewFields: "<ViewFields><FieldRef Name='Title' /><FieldRef Name='ID' /></ViewFields>", 
      CAMLQuery: '<Query><Where><Eq><FieldRef Name="Title" /><Value Type="Text"><![CDATA['+itemTitle+']]></Value></Eq></Where></Query>', 
      listName: 'AGItems', 
      completefunc: function (xData, Status) { 
       $(xData.responseXML).SPFilterNode("z:row").each(function() { 
        ID = $(this).attr("ows_ID"); 
        //Now have oldLink and newID in variables - build newLink from known URL & newID 
        newLink = urlStart+ID;  
         });//response xml 
        }//completefunc 
       });//spservices 
    //check for empty links 
    if((oldLink && newLink != '') && (oldLink && newLink != undefined)){ 
     var linkPair = [oldLink,newLink]; 
     linkContainerArray.push(linkPair); 
    } 


    } 

    }); 

    replaceLinks(linkContainerArray); 


} 

次に、リンクを検索して置換する関数を呼び出します(これは変数が動作しない場所です)。私は、次の方法のすべての組み合わせに脱出しようとしました:

function escapeRegExp(stringToGoIntoTheRegex) { 
return stringToGoIntoTheRegex.replace(/[\/\\^$*+?.|[\]{}]/g, '\\$&'); 
} 

function htmlEncode(value){ 
//create a in-memory div, set it's inner text(which jQuery  automatically  encodes) 
    //then grab the encoded contents back out. The div never exists on the  page. 
    return $('<div/>').text(value).html(); 
} 

function htmlEscape(str) { 
return String(str) 
    .replace(/"/g, '&quot;') 
    .replace(/'/g, "&#39;") 
    .replace(/</g, '&lt;') 
    .replace(/>/g, '&gt;'); 
} 

function escapeRegExp(stringToGoIntoTheRegex) { 
    return stringToGoIntoTheRegex.replace(/[\/\\^$*+?.|[\]{}]/g, '\\$&'); 
} 

はまた、すべてのものを簡単にするためにHTML &変数からの完全停止し、疑問符を削除し、それはまだ働いていません。

も...誰もがすべてでこれで私のために任意のヘルプを持っている場合は、まだ運

はそれがはるかに高く評価されないであろうか、多分私は欠けているものを見ることができますHTML & oldlink変数にencodeURIComponentでを試してみました!

おかげ

+0

oldLinkのサンプル値を投稿できますか?ここでは正規表現で変数を使用して動作するフィドルです:https://jsfiddle.net/omerts/rcm65bqo/ – omerts

+0

確かに!ありがとう.. oldLinkは、次のものと非常によく似ています(。と?を取り除いた後に?):SharePointを引っ張ったHTMLに一致するものがあります。 http : // someplaintext/pages/GuidelinesaspxiPageId = 14495 – cptasker

+0

入力推測を避けるために予想される出力があります。 – 1983

答えて

1

文字列の一部の文字が\.のように、正規表現で特別な意味を持っているので、それは動作しません。だから彼らは逃げる必要がある。

あなたはこの機能を使用することができます。

function escapeRegExp(str) { 
 
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
 
} 
 

 

 
var newHTML = '<a href="http://someplaintext/pages/GuidelinesaspxiPageId=14495"> my link </a>'; 
 
var oldLink = 'http://someplaintext/pages/GuidelinesaspxiPageId=14495'; 
 
var newLink = 'http://urlstart?id=14495'; 
 
newHTML = newHTML.replace(new RegExp(escapeRegExp(oldLink), 'gi'), newLink); 
 
console.log(newHTML);

this questionを参照してください。

+0

私はそれを試みました、可能なすべてのエスケープしようとしました! – cptasker

+0

私はエスケープで溺れている、私は質問に使用している別の正規表現のエスケープを追加しました:) – cptasker

+0

私は私の答えにスニペットを入れました。これは、HTMLウェルのURLを置き換えます。あなたは確認できますか? – trincot

関連する問題