2016-06-02 19 views
1

Ich hoffe, jemand kann mir helfen, es macht mich verrückt.Javascript finden und ersetzen funktioniert mit Zeichenfolge, aber nicht variabel

Ich benutze SPServices und Javascript, um einige Links nach einer kleinen Inhaltsmigration neu zu schreiben.

Ich habe einige HTML in einer Variablen und ich versuche, eine Zeichenfolge zu finden, die eine bestimmte URL ist und sie durch eine andere URL ersetzen. Dies funktioniert:

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

Auch dies funktioniert:

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

Aber wenn ich in eine Variable mit der gleichen Zeichenfolge haben es nicht funktioniert:

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

Mein oldLink Die Variable kommt von einem SPServices-Aufruf zu einer anderen Listenspalte, die HTML enthält. Ich nehme die "a" -Tags und lege sie in ein Array:

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); 


} 

Dann rufe ich eine Funktion zum Suchen und Ersetzen der Links (das ist, wo meine Variable nicht funktioniert). Ich habe in allen Kombinationen der folgenden Weisen versucht zu entkommen:

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, '\\$&'); 
} 

auch entfernt Punkt und Fragezeichen aus dem HTML-& variabel machen alles einfach und es funktioniert immer noch nicht.

auch versucht encodeURIComponent auf der HTML-& oldlink Variable .. noch kein Glück

Wenn jemand eine Hilfe für mich mit dieser überhaupt hat es sehr geschätzt werden würde, oder vielleicht sehen, was ich bin fehlt ?!

Dank

+0

Könnten Sie einen Beispielwert von oldLink posten? Hier ist eine Geige, die eine Variable in einer Regex verwendet und funktioniert: https://jsfiddle.net/omers/rcm65bqo/ – omerts

+0

Sicher! Dank .. oldLink ist sehr ähnlich wie die folgenden auch die Codierung (nach dem Entfernen und.?): Entsprechen, was die HTML von Sharepoint gezogen hat http // : someplaintext/pages/GuidelinesaspxiPageId = 14495 – cptasker

+0

Bitte würden Sie klar Eingänge definieren und erwartete Ausgaben, um Rätselraten zu vermeiden. – 1983

Antwort

1

Es funktioniert nicht, weil einige die Zeichen in der Zeichenfolge, die eine besondere Bedeutung in einem regulären Ausdruck haben, wie \ und .. Sie müssen also entkommen.

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);

Siehe auch this question:

können Sie diese Funktion verwenden.

+0

Ich habe das versucht, habe alle möglichen Flucht versucht! – cptasker

+0

Tut mir leid, ich hätte das oben gepostet Ich ertrinke in Fluchten, habe gerade einen weiteren Regex-Fluch hinzugefügt, den ich zur Frage verwende :) – cptasker

+0

Ich habe einen Ausschnitt in meine Antwort eingefügt. Es ersetzt die URL in der HTML-Quelle. Kannst du bestätigen? – trincot

Verwandte Themen