thomas: PHP-Variablen in String erkennen

Hallo zusammen!

Folgendes Problem: Aus einer SQL-Datenbank lese ich einen String, der PHP-Variablen enthält. zB: "Dies ist ein String namens $stringName und er ist $stringLength Zeichen lang."
Ist es nun überhaupt möglich, diese PHP-Variablen durch deren Wert zu ersetzen?

Bei den Strings handelt es sich um Sprachschnipsel. Die Webseite sollte dann in verschiedenen Sprachen zugänglich sein. Über eine Funktion wird der gewünschte Schnipsel von der DB geholt, der im Backend vorher in den verschiedenen Sprachen eingetragen wurde. Damit der String nicht in tausende Schnipsel zerlegt werden muss, sollte er solche PHP-Variabeln umwandeln können. Ich bezweifle jedoch, dass dies überhaupt möglich ist... oder weiss jemand wie das funktioniert?

Danke, Lg
Thomas

  1. Hallo Thomas!

    Folgendes Problem: Aus einer SQL-Datenbank lese ich einen String, der PHP-Variablen enthält. zB: "Dies ist ein String namens $stringName und er ist $stringLength Zeichen lang."
    Ist es nun überhaupt möglich, diese PHP-Variablen durch deren Wert zu ersetzen?

    Klingt für mich als wenn du die Funktionen serialize() und unserialize() suchen würdest.

    Gruß Gunther

  2. Moin!

    Ist es nun überhaupt möglich, diese PHP-Variablen durch deren Wert zu ersetzen?

    Klar, das ist möglich mit str_replace oder über eval..

    Bei den Strings handelt es sich um Sprachschnipsel. Die Webseite sollte dann in verschiedenen Sprachen zugänglich sein. Über eine Funktion wird der gewünschte Schnipsel von der DB geholt, der im Backend vorher in den verschiedenen Sprachen eingetragen wurde. Damit der String nicht in tausende Schnipsel zerlegt werden muss, sollte er solche PHP-Variabeln umwandeln können. Ich bezweifle jedoch, dass dies überhaupt möglich ist... oder weiss jemand wie das funktioniert?

    Diesen Absatz verstehe ich nicht ganz... Wenn du auf die DB-Strings mit den Variablen über unterschiedliche Sprachen zugreifen können willst, ist das bestimmt kein Problem, denn jede Programmiersprache sollte in der Lage sein den String zu bearbeiten und $variable durch den Wert zu ersetzen.

    Grüße
    crille

    1. Hallo!

      Super!! Genau das eval() habe ich gesucht!
      Mit str_replace() funktioniert es nicht, da ich nicht genau weiss, wie die Variablen heissen, es soll für alle Variablen funktionieren.

      @Gunther: Diese Funktionen habe ich auf die Schnelle nicht ganz verstanden, klingt aber so, dass es etwas schon vor dem Eintragen in die DB umwandelt. Aber ich habe ja jetzt eine Lösung.

      Sorry, ich habe es vorher nicht so verständlich geschrieben. Mit Sprachen sind nicht Skriptsprachen gemeint sondern zb Deutsch, Französisch etc. :)

      Wenn die Webseite zB auf Französisch aufgerufen wird, könnte der Code folgendermassen aussehen:

      $name = 'Kurt';
      $linkBegin = '<a href="?id=1">';
      $linkEnd = '</a>';
      echo( getLang('fr',2) );  // 'fr' ist die Sprache, 2 die ID des Sprachschnipsels in der DB

      Das Sprachschnipsel auf Französisch sieht in der DB vielleicht so aus:
      "Bonjour, je m'appelle <$name> et je vous pris de visiter mon <$linkBegin>homepage<$linkEnd>."

      Ausgegeben soll dann folgendes werden:
      "Bonjour, je m'appelle Kurt et je vous pris de visiter mon <a href="?id=1">homepage</a>."

      Danke für die Antworten!

      Lg Thomas

      1. Moin!

        Super!! Genau das eval() habe ich gesucht!

        Schön, dass ich weiterhelfen konnte...

        Noch eine Rückfrage:

        Mit str_replace() funktioniert es nicht, da ich nicht genau weiss, wie die Variablen heissen, es soll für alle Variablen funktionieren.

        Du musst aber auch bei eval wissen, wie die Variablen heißen, denn sie müssen belegt sein:

        $name = 'Kurt';
        $linkBegin = '<a href="?id=1">';
        $linkEnd = '</a>';

        Bei str_replace() sähe der Code wie folgt aus:

        $str = "Bonjour, je m'appelle $name et je vous pris de visiter mon $linkBegin homepage $linkEnd.";  
        $linkanfang = '<a href="?id=1">';  
        $linkende = '</a>';  
        str_replace(  
        array('$name',  
              '$linkBegin',  
              '$linkEnd'),  
        array('Kurt',  
              $linkanfang,  
              $linkende),  
        $str);
        

        Vorteil des str_replace() ist meiner Meinung nach, dass du nochmal explizit an einer Stelle alle möglichen Variablen des Textes vorliegen hast und so weißt, welche Variablen belegt sein müssen. Bei eval() kann das sehr schnell unter gehen.

        Grüße
        crille

        1. Noch eine Rückfrage:

          Mit str_replace() funktioniert es nicht, da ich nicht genau weiss, wie die Variablen heissen, es soll für alle Variablen funktionieren.
          Du musst aber auch bei eval wissen, wie die Variablen heißen, denn sie müssen belegt sein:
          $name = 'Kurt';
          $linkBegin = '<a href="?id=1">';
          $linkEnd = '</a>';

          Hallo!
          Es soll am Schluss eine Funktion geben (zB getLang($lang, $id) ), die den String in der angegebenen Sprache und mit der angegebenen ID von der DB holt und dabei gleich auch noch alle PHP-Variablen im String durch deren eigentliche Werte ersetzt. Egal wie die Variablen genau heissen.
          Ich habe aber gerade gemerkt, dass ich ja innerhalb der Funktion die Variablen, die "draussen" definiert worden sind gar nicht zur Verfügung habe. Aber ich glaube folgendermassen müsste es funktionieren: Ich schaue zuerst, welche PHP-Variablen überhaupt im String vorkommen und schreibe diese in ein Array, danach hole ich jede dieser PHP-Variablen mittels einer Schlaufe in die Funktion rein (das sollte mit eval("global $" . $array[$i]); funktionieren).
          Das Ziel ist also, dass die Funktion mit irgendwelchen Variablen arbeitet, nicht nur zB mit $name, $linkBegin und $linkEnd, sondern mit allem was halt vorkommt.

          Lg

          1. Hallo

            UFF! Nun hab ichs endlich geschafft!

            function getLang($lang, $id)  
            {  
             mysqlConnect();  
             // Infos von der DB holen  
             $sql = "SELECT * FROM table_lang WHERE ID = $id";  
             if ( $result = mysql_query($sql) )  
             {  
              // Bei erfolgreicher MySQL-Abfrage, PHP-Variablen umwandeln  
              $row = mysql_fetch_array($result);  
              
              // schauen welche PHP-Variablen enthalten sind  
              $up_to_var = $row[$lang];  
              
              // ist noch eine Variable drin?  
              for ( $i = 0; strpos($up_to_var, "&lt;$") !== false; $i++ )  
              {  
               // wo ist naechste Var?  
               $position = strpos($up_to_var, "&lt;$");  
               // bis vor Var-Name abschneiden  
               $up_to_var = substr($up_to_var, ($position+5));  
               // wo ist Var fertig?  
               $position = strpos($up_to_var, "&gt;");  
               // Var-Name extrahieren  
               $var_name = substr($up_to_var, 0, $position);  
              
               // Var-Name in ein Array packen  
               $variables[$i] = $var_name;  
              }  
              
              // nun sind alle PHP-Variablen vom String extrahiert worden  
              // es werden nun alle Variablen durch "global" in die Funktion geholt  
              foreach ( $variables as $variable )  
              {  
               eval("global \$$variable;");  
              }  
              
              // PHP-Variablen im String umwandeln  
              eval("\$string = \"$row[$lang]\";");  
              // Die Zeichen < und > entfernen  
              $string = str_replace('&lt;', '', $string);  
              $string = str_replace('&gt;', '', $string);  
              $return = $string;  
             } else {  
              $return = false;  
             }  
              
             return $return;  
            }
            

            Beispiel:

              
            $name = 'Tester';  
            $test_var = 'sowas!';  
            print_r( getLang('fr', 2) );  
            
            

            Der Eintrag in der DB lautet: "Mon nom est <$name>! Je veux vous encore dire: <$test_var>, n'est pas?"

            Vielen Dank für eure Hilfe!

            Lg Thomas

      2. $name = 'Kurt';
        $linkBegin = '<a href="?id=1">';
        $linkEnd = '</a>';
        echo( getLang('fr',2) );  // 'fr' ist die Sprache, 2 die ID des Sprachschnipsels in der DB

        Sorry, mein Beispiel kann schlecht funktionieren, da ja der String innerhalb der Funktion getLang() umgewandelt wird und dort ja die benötigten Variablen nicht vorhanden sind. Es gibt wohl keine andere Möglichkeit, als die Variablen mit global zu deklarieren, so dass sie auch innerhalb der Funktion erkannt werden...

        Lg

      3. Hallo Thomas!

        @Gunther: Diese Funktionen habe ich auf die Schnelle nicht ganz verstanden, klingt aber so, dass es etwas schon vor dem Eintragen in die DB umwandelt. Aber ich habe ja jetzt eine Lösung.

        Ja, ich hatte dein Posting falsch verstanden - fiel mir auch schon auf, direkt nachdem ich crilles Antwort gelesen hatte, der dir ja zum Glück auch gleich die richtige Antwort geliefert hat.

        Sorry, falls ich dich (kurzfristig) verwirrt haben sollte - keine Absicht! ;-)

        Weiterhin viel Erfolg!

        Gruß Gunther

  3. Hello,

    je nachdem, wie Dein DBMS ausgestattet ist, könntest Du ihm auch die Aufgabe aufhalsen.

    Es benötigt dafür eine RegEx-Funktion und/oder je nach deren Funktionsweise noch eine Replace-Funktion. Wenn Du dann nicht direkt über ein Select, sondern über eien Stored Procedure zugreifst auf Deine Datenbank, dann kan diese die passenden Ersetzungnen zum Stammdatensatz aus einer anderen Tabelle heraussuchen (je nach Spracheinstellung) und die Ersetzung durchführen.

    Mit MySQL ab 5.0 ist das ohne weiteres möglich.

    Deine API wäre dann also vollkommen außen vor und bekäme bereits die passend aufbereiteten Daten angeboten.

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de