Janine: Text zwischen ##TEXT## durch Variable ersetzen

Moin

ich habe einen String
Beispiel: $string = 'Dies ist ein String mit ##variablea## und ##irgndetwas##';
ich möchte jetzt ##variablea## durch $array['variablea'] und ##irgndetwas## durch $array[irgndetwas] ersetzen

die ##xxx# können mehrmals oder überhauptnicht auftreten, desweiteren können auch viele unterschiedliche auftauchen

welche Möglichkeiten hab ich, damit ich ein Anhaltspunkt habe, wie ich anfangen kann
zur Zeit hab ich ein Brett vor mein Kopf :-\

ps. die Geschwindigkeit spielt nicht so die Rolle, da der fertige String nachher im Filesystem abgesopeichert werden soll und dann so zur Verfügung steht

Janine

  1. Hallo Janine,

    so etwas funktioniert beispielsweise:

    <?
    $input = 'Dies ist ein String mit ##variablea## und ##irgendetwas##';

    $array['variablea'] = "Pauken";
    $array['irgendetwas'] = "Trompeten";

    $output = $input;

    foreach ($array as $key => $value) {
     $search_pattern = "##".$key."##";
     $output = ereg_replace($search_pattern, $value, $output);
    }

    echo "<strong>input: </strong>".$input."<br>";
    echo "<strong>output: </strong>".$output."<br>";
    ?>

    Es gibt bestimmt noch elegantere Lösungen mit regular expressions (http://www.php.net/manual/en/ref.pcre.php), aber das war leider noch nie meine Stärke.

    Ich hoffe, es hilft dir erstmal weiter.

    Schöne Grüße
    Anatol

  2. Hi Janine,

    Beispiel: $string = 'Dies ist ein String mit ##variablea## und ##irgndetwas##';
    ich möchte jetzt ##variablea## durch $array['variablea'] und ##irgndetwas## durch $array[irgndetwas] ersetzen

    versuch's mit:

      
    $newstring = str_replace('##variablea##', $array['variablea']);  
    $newstring = str_replace('##irgndetwas##', $array['irgndetwas']);  
    
    

    ... oder ereg_replace(), welches um einiges maechtiger ist. Mit ereg_replace() ist auch ne dynamische Loesung moeglich. Siehe dazu:
    http://au3.php.net/manual/en/function.ereg-replace.php
    und:
    http://www.regular-expressions.info/

    Gruesse,

    Lynky

    die ##xxx# können mehrmals oder überhauptnicht auftreten, desweiteren können auch viele unterschiedliche auftauchen

    welche Möglichkeiten hab ich, damit ich ein Anhaltspunkt habe, wie ich anfangen kann
    zur Zeit hab ich ein Brett vor mein Kopf :-\

    ps. die Geschwindigkeit spielt nicht so die Rolle, da der fertige String nachher im Filesystem abgesopeichert werden soll und dann so zur Verfügung steht

    Janine

    1. ... Mit ereg_replace() ist auch ne dynamische Loesung moeglich.

      Soll heissen: "das nehme ich an" - habe das "denke ich" vergessen ;)
      Bin auch alles andere als ein Reg.-Expressions.-Profi.

      Lynky

  3. Ich würde preg_replace() verwenden.

    Für Synthanx guckst du bei php net und hier:
    http://www.php-resource.de/tutorials/read/10/1/

  4. echo $begrüßung;

    Beispiel: $string = 'Dies ist ein String mit ##variablea## und ##irgndetwas##';
    ich möchte jetzt ##variablea## durch $array['variablea'] und ##irgndetwas## durch $array[irgndetwas] ersetzen

    Es kam ja schon einiges an Vorschlägen. Reguläre Ausdrücke sind hier zu viel des Guten, da es sich nur um einfache feststehende Strings handelt, die getauscht werden sollen.

    Völlig ausreichend ist str_replace(), das braucht aber zwei Arrays als Parameter, eins mit den Suchstrings, eins mit den zu ersetzenden.

    Mit nur einem Array kommt strtr() aus (die zweite Syntax).

    echo "$verabschiedung $name";

    1. Moin

      Beispiel: $string = 'Dies ist ein String mit ##variablea## und ##irgndetwas##';
      ich möchte jetzt ##variablea## durch $array['variablea'] und ##irgndetwas## durch $array[irgndetwas] ersetzen

      Es kam ja schon einiges an Vorschlägen. Reguläre Ausdrücke sind hier zu viel des Guten, da es sich nur um einfache feststehende Strings handelt, die getauscht werden sollen.

      Völlig ausreichend ist str_replace(), das braucht aber zwei Arrays als Parameter, eins mit den Suchstrings, eins mit den zu ersetzenden.

      ich brauche das ganze dynamisch, da das array mit werden aus der Datenbank gefüllt wird

      wie gut, dass ich mich regex nicht so gut auskenne ;-)

      ich habe hin+wieder mal was mit ereg gemacht, das ist denke ich mal aber kein Vergleich

      danke
      Janine

      1. echo $begrüßung;

        ich brauche das ganze dynamisch, da das array mit werden aus der Datenbank gefüllt wird

        Dynamisch - statisch - wie du das Array füllst/anlegst, das du strtr() übergibst ist doch egal.

        echo "$verabschiedung $name";

        1. Moin

          ich brauche das ganze dynamisch, da das array mit werden aus der Datenbank gefüllt wird

          Dynamisch - statisch - wie du das Array füllst/anlegst, das du strtr() übergibst ist doch egal.

          du meinst also?
          ich renne die Datanbankabfrage durch und erstelle daraus dann einmal ##yyy## und $array['yyy'] ?

          die Datenbank hat ca. 5000 Einträge, also ca. 5000 Variablen entstehen nachher, mit der Zeit können es auch mehr werden :-)

          das ganze wird zur Zeit 400 mal durchlaufen (400 Seiten sollen abgespeichert werden, in den nächsten Wochen wird aus den 400 ca. 1000+++

          wie lange würde das ungefähr dauern?

          Der Hintergrund... es wird eine komplette Website mit mehreren Sprachen auf'n Dateisystem abgespeichert

          eine Sprache hat zur Zeit ca. 200 Seiten

          das ganze soll statisch werden, da Änderungen nur sehr selten auftreten und wir der Meinung sind, dass reine HTML-Seiten schneller sind

          danke
          Janine

          1. echo $begrüßung;

            Dynamisch - statisch - wie du das Array füllst/anlegst, das du strtr() übergibst ist doch egal.

            du meinst also?
            ich renne die Datanbankabfrage durch und erstelle daraus dann einmal ##yyy## und $array['yyy'] ?

            Wenn in der ersten Spalte der Datenbankabfrage yyy bzw. ##yyy## steht und in der zweiten Spalte der Ersatzstring, dann kann das Array so aufgebaut werden:
            $replace = array();
            while ($row = fetch_row(...))
              $replace['##' . $row[0] . '##'] = $row[1]; // bzw. $replace[$row[0]] = $row[1];

            die Datenbank hat ca. 5000 Einträge, also ca. 5000 Variablen entstehen nachher, mit der Zeit können es auch mehr werden :-)

            das ganze wird zur Zeit 400 mal durchlaufen (400 Seiten sollen abgespeichert werden, in den nächsten Wochen wird aus den 400 ca. 1000+++

            Sag das doch gleich, bei so einer Menge ist das möglicherweise nicht die ideale Lösung.

            wie lange würde das ungefähr dauern?

            Garantiert nicht länger als die max_execution_time. :-)

            Man kann das nicht so pauschal sagen. Das kommt auf die Rechenleistung und auch auf die Datenbankverbindung an.

            Der Hintergrund... es wird eine komplette Website mit mehreren Sprachen auf'n Dateisystem abgespeichert
            eine Sprache hat zur Zeit ca. 200 Seiten
            das ganze soll statisch werden, da Änderungen nur sehr selten auftreten und wir der Meinung sind, dass reine HTML-Seiten schneller sind

            Macht das irgendwann einmal einer, der weiß dass das lange dauern kann? Oder warten Leute auf das Ergebnis, weil sie z.B. die Seiten ändern, ansehen, wieder ändern?

            Mein Vorschlag: Probier erstmal die obige Lösung.
            Wenn das zu lange dauert, dann prüfe, welcher Teil die Zeit verbraucht, die Datenbankabfrage oder das Ersetzen (Zeitmessung z.B. mit microtime()).
            Wenn die Datenbankabfrage zu lange dauert, dann kann man die vielleicht so einschränken:

            Die zu bearbeitende Seite wird nach den ##xxx## durchsucht (ja, an der Stelle sind RegExps angebracht). Mit diesen gefundenen Wörtern als Bedingung wird die Datenbank befragt und damit die Ersetzung mit strtr() erledigt. Dann kommt die nächste Seite dran.

            Vielleicht dauert das dann aber insgesamt noch länger, weil nun viele kleine Abfragen statt einer großen gemacht werden müssen.

            Wie du siehst, sind hier einige Wenns und Vielleichts in meiner Antwort. Da hilft nur Ausprobieren und Erfahrung sammeln und wenn du keine Lösung findest hier wieder nachfragen.

            echo "$verabschiedung $name";