Sebi: StringReplace -> Array, Multiline, RegEx?

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

  1. Hi,

    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.

    Ich habe den Verdacht, dass du gerade ein ziemlich komplexes eigenes System aufziehen willst für etwas, das jedes handelsübliche Template-System (und damit PHP auch schon selber mittels includes) bereits bietet ...?

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Ich habe den Verdacht, dass du gerade ein ziemlich komplexes eigenes System aufziehen willst für etwas, das jedes handelsübliche Template-System (und damit PHP auch schon selber mittels includes) bereits bietet ...?

      MfG ChrisB

      Hallo ChrisB!

      Nein, etwas größeres oder gar komplexeres soll das nicht werden :-)

      Würde ich etwas umfangreicheres vorhaben würde ich mit includes arbeiten, oder noch besser: gleich ein CMS verwenden.

      Ich bräuchte diese funktion allerdings nur um eine handvoll statische HTML-seiten online editierbar zu machen. Ein WYSIWYG wie zb. TinyMCE soll dazu verwendet werden die sich geringfügig ändernden Inhalte zu bearbeiten, das ganze soll dann eben wieder statisch als normale HTML-Datei abgelegt werden.

      Generell gäbs sicher viele Wege das umzusetzen, da aber noch garnicht absehbar ist ob die eher simplen Webseiten überhaupt langfristig benötigt werden versuche ich den Aufwand gering zu halten - das schreiben der Scripte für dieses Vorhaben soll dabei irgendwo meinem PHP-lerneffekt zugute kommen ;-)

      Ich bin natürlich auch für jede Idee dankbar wie man rein statische Webseiten ohne umfangreichere Änderungen und ohne CMS, ohne Datenbank und ohne neuem Template-system möglichst simpel online editieren kann.

      Das aufteilen der zu ändernden Bereiche geschieht auch nur aus dem Grund dass es für den völlig unbewanderten Nutzer sehr warscheinlich leichter ist nur Inhalte zu ändern, ohne überhaupt Code-geschreibsel oder Tags sehen zu müssen.

      Grüße,

      Sebi

      1. PS:

        Das anfangs gezeigte Beispiel von mir tut ja bereits seinen Dienst, das funktioniert schon so. Ich bin nur kein erfahrener Programmierer und mich würde interessieren wie jemand diese Funktion basteln würde, der sich etwas besser mit der Materie auskennt. Ich selbst probier da immer wieder mal rum, komm aber zu keinem ergebnis dass mir "optimal" erscheint :-)

        Sebi