Mathias Brodala: Ersetzen mit Array

Beitrag lesen

Hallo nochmal.

Wenn "string1" mehrmals im Text vorkommt, wird nur das erste Vorkommen ersetzt. Was kann ich da machen?

So zum Beispiel:

So viel zur Quick-and-Dirty-Lösung. Nun eine vermeintlich bessere:

function js_str_replace(mix1, mix2, str) {  
  
  // Die ersten beiden Argumente müssen Arrays sein …  
  if (typeof(mix1) == 'object' && mix1.[ref:self811;javascript/objekte/array.htm#length@title=length] &&  
      typeof(mix2) == 'object' && mix2.length) {  
  
    // … und die Anzahl ihrer Elemente muss übereinstimmen  
    if (mix1.length == mix2.length) {  
  
      // Alle Elemente durchlaufen  
      for (var i = 0; i < mix1.length; ++i) {  
  
        // Bei jedem Element einmalig bei 0 anfangen  
        var offset = 0;  
        // Das erste Vorkommen suchen  
        var found = str.indexOf(mix1[i], offset);  
  
        // Solange Vorkommen gefunden  
        while (found != -1) {  
  
          // Teilzeichenkette davor …  
          var before = str.[ref:self811;javascript/objekte/string.htm#substring@title=substring](0, found);  
          // … und danach extrahieren  
          var after = str.[ref:self811;javascript/objekte/string.htm#substr@title=substr](before.length + mix1[i].length);  
  
          // Startpunkt erhöhen, sonst gibts eine nette Endlosschleife  
          offset = ++found;  
          // Nächstes Vorkommen suchen  
          found = str.indexOf(mix1[i], offset);  
  
          // Teilzeichenkette vorher mit Ersetzung und Teilzeichenkette nachher zusammensetzen  
          str = before + mix2[i] + after;  
  
        }  
  
      }  
  
      // Am Ende aller Ersetzungen zurückgeben  
      return str;  
  
    } else {  
  
      // Die Anzahl der Elemente muss definitiv gleich sein  
      return false;  
  
    }  
  
  }  
  
  // Siehe oben  
  var offset = 0;  
  var found = str.indexOf(mix1, offset);  
  
  while (found != -1) {  
  
    var before = str.substring(0, found);  
    var after = str.substr(before.length + mix1.length);  
  
    offset = ++found;  
    found = str.indexOf(mix1, offset);  
  
    str = before + mix2 + after;  
  
  }  
  
  return str;  
  
}  
  
var from = ['string1', 'string2', 'string3'];  
var to = ['ersatz1', 'ersatz2', 'ersatz3'];  
var str = 'string1 string3 string2, string3string2';  
  
alert(js_str_replace(from, to, str)); // ersatz1 ersatz3 ersatz2, ersatz3ersatz2  
  
alert(js_str_replace('foo', 'bar', 'Lesfoo')); // Lesbar

„Vermeintlich“, weil die while-Schleife zum Auffinden aller Vorkommen zweimal notiert werden muss, was mir jedoch gar nicht gefällt.

Einen schönen Mittwoch noch.

Gruß, Mathias

--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
„It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
[HTML Design Constraints: Logical Markup]