Sebi: StringReplace -> Array, Multiline, RegEx?

Beitrag lesen

Hallo community,

ich bin dabei ein kleines Script zu basteln mit dem sich bestimmte Teile von Dateien durch einfache Stringfunktionen austauschen lassen.

Gedacht ist das so dass bestimmte, durch Start- und Endkommentare kenntlich gemachte Abschnitte, halbwegs bequem geändert werden können. Das hab ich auch schon funktionierend umsetzen können, allerdings befürchte ich dass ich viel zu umständlich vorgehe.

Vielleicht wäre jemand so freundlich mir aufzuzeigen wie man eine derartige funktion besser (also zb. schneller, mit weniger code, ressourcenfreundlicher) umsetzen kann?

Hier mal das was ich bisher zustandegebracht habe:

---

  
<?php  
// Die zu ändernde Datei wird eingelesen, das sollte ein Array ergeben dass so aussehen könnte:  
$txt_1 = array('Lorem ipsum dolor sit amet consectetuer lorem quis Aliquam elit habitasse.',  
               'Iaculis Aenean accumsan Aenean non nunc Nulla ac magna Curabitur at. [replace]At Vivamus',  
               'ridiculus lobortis adipiscing gravida nibh Curabitur eros at tristique.[/replace] Nunc',  
               'Quisque urna elit scelerisque pulvinar tincidunt leo mattis Vestibulum at.',  
               'Laoreet mollis at et et tellus risus enim nibh.'  
              );  
  
$txt_2 = array();  
  
  
$pattern_incomplete = '([\[replace]]?.*?\[/replace])';  
$pattern_complete   = '(\[replace].*?\[/replace])';  
$replace            = '[replace]Alles neu, macht der Mai...[/replace]';  
  
  
for ($i = 0; $i < count($txt_1); $i++){  
  if(strpos($txt_1[$i], '[replace]')){  
    if(strpos($txt_1[$i], '[/replace]')){  
      $txt_2[] = preg_replace($pattern_complete, $replace, $txt_1[$i]);  
    } else {  
      $tmp = substr($txt_1[$i], 0, strpos($txt_1[$i], '[replace]'));  
      while(!strpos($txt_1[$i], '[/replace]')){  
        $i++;  
      }  
      $txt_2[] = $tmp . preg_replace($pattern_incomplete, $replace, $txt_1[$i]);  
    }  
  } else {  
    $txt_2[] = $txt_1[$i];  
  }  
}  
  
echo "---vorher---\n\n";  
print_r($txt_1);  
echo "\n\n";  
echo "---nachher---\n\n";  
print_r($txt_2);  
?>  

---

Gedanken dazu:
--------------

  1. Grundsätzlich müsste man nicht unbedingt mit Arrays arbeiten - die Datei, die eingelesen wird, könnte man ja ebensogut als einzelnen String handhaben. Dabei befürchte ich allerdings dass es nicht besonders ratsam ist mit sehr sehr langen Strings zu hantieren, sofern die Datei eben etwas größer wäre. Täusch ich mich da, was empfiehlt sich hier?

  2. Wird die Datei wie im Beispiel als Array hinterlegt gilt es darauf zu achten dass [replace] und [/replace] sowohl in der selben, als auch in verschiedenen Zeilen vorkommen können. Deshalb die etwas umständliche aufteilung in der FOR-schleife und zwei unterschiedliche angaben als RegEx-pattern. Könnte man das mit einer entsprechenden RegEx und anderer vorgehensweise womöglich etwas eleganter lösen?

  3. Was mich auch etwas stört ist der "zersplitterte" code. Würden sich hier beispielsweise die Start- Und Endmarkierungen ändern bräuchte man zwei neue RegEx und man müsste weitere vier vorkommen dieser Markierungen in der FOR-Schleife ändern. Ich werd das Gefühl nicht los dass man auch das deutlich geschickter machen könnte...

Und vielleicht gibt es dazu noch ganz andere Gedanken oder Ideen, auf die ich selbst garnicht komm...

Danke, Grüße,

Sebi