dbenzhuser: preg_replace() - wo ist der ver$&/$" Fehler?

N'Obend

Reißt euch bitte mal kurz von einem der Umgangston-Threads los die hier gerade wuchern :)

Ich bin gerade dabei meinen kleinen Formmailer ein wenig umschreiben und stecke hier schon seit 3 Stunden an dieser dummen kleinen Stelle:

Und zwar hab ich ein kleines Template in dem die Platzhalter in der Form {{name}} drinstehen. Entsprechend sind die Felder im Formular benannt. Hier gehts darum die Formulardaten einzufügen.
Ich hatte es auch schon funktionierend, da mit einer foreach($_POST as $key => $value)-Konstruktion, die für jede Variable einmal komplett über das Template gegangen ist. Ich hätts aber gerne eleganter...

Momentan sieht das Ding so aus:

$bla = preg_replace("!{{(.*)}}!U", $_POST[$1], $string);

Ich bekomme da nur ein
Parse error: parse error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in (...)
zurück.

Setze ich anstatt dem $1 direkt den entsprechenden namen ein funktionierts, lasse ich das $_POST weg und nehme nur $1, werden die namen korrekt angezeigt, das Pattern scheint also zu stimmen.

Ich hab jetzt schon jede mir denkbare Möglichkeit $_POST[$1] mit oder ohne Anführungszeichen zu schreiben durchprobiert... ich bekomms nicht zum laufen.
Ich gehe davon aus, dass ich irgend einen sau dummen minni-Fehler irgendwo reingehauen hab, wäre nett wenn mich jemand draufstoßen könnte. Ich kanns mir nicht erklären.

Tschö,
dbenzhuser

  1. Hi,

    $bla = preg_replace("!{{(.*)}}!U", $_POST[$1], $string);

    Die Parameter werden vor dem Aufruf ausgewertet.
    Zu diesem Zeitpunkt ist $1 aber noch nicht definiert - das wird ja erst während des Ausführens von preg_replace (also nach dem Aufruf) ermittelt.

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Servus Andreas

      $bla = preg_replace("!{{(.*)}}!U", $_POST[$1], $string);

      Die Parameter werden vor dem Aufruf ausgewertet.
      Zu diesem Zeitpunkt ist $1 aber noch nicht definiert - das wird ja erst während des Ausführens von preg_replace (also nach dem Aufruf) ermittelt.

      Danke dir, das erklärt es. Zumindest bin ich noch nicht senil...
      Dann werd ich mir was anderes überlegen müssen. Argh :(

      tschö,
      dbenzhuser

      1. Hallo, dbenzhuser!

        Dann werd ich mir was anderes überlegen müssen. Argh :(

        arbeite mit preg_match und führe das austauschen in der nächsten zeile durch. ;)

        freundl. Grüsse aus Berlin, Raik

  2. Hallo,

    $bla = preg_replace("!{{(.*)}}!U", $_POST[$1], $string);

    $1 ist in php eigentlich keine gültige Variable - versuch mal um $1 (oder um $_POST[$1]) einen Satz doppelte Anführungszeichen zu setzen.

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. N'Obend

      Hallo,

      $bla = preg_replace("!{{(.*)}}!U", $_POST[$1], $string);
      $1 ist in php eigentlich keine gültige Variable - versuch mal um $1 (oder um $_POST[$1]) einen Satz doppelte Anführungszeichen zu setzen.

      Alles schon probiert, um $_POST[] gibts eine Fehlermeldung, um $1 werden die Platzhalter einfach gelöscht.

      MudGuards Erklärung leuchtet mir durchaus ein. Nur gefallen will sie mir nicht ;)

      Tschö,
      dbenzhuser

  3. Huhu dbenzhuser

    Momentan sieht das Ding so aus:

    $bla = preg_replace("!{{(.*)}}!U", $_POST[$1], $string);

    Eine einfache Möglichkeit wäre der e-modifier (eval).

    Also z.B. so
    <?php

    $test = array ('LAND' => 'Griechland', 'STADT' => Athen);

    $text = "Die Haupstadt von {LAND} ist {STADT}.";

    $bla = preg_replace('#{(.*)}#Ue', '$test["$1"]', $text);

    echo $bla;
    ?>

    Oder als Funktion

    <?php

    $test = array ('LAND' => 'Griechland', 'STADT' => Athen);

    $text = "Die Haupstadt von {LAND} ist {STADT}. {FAHNE}";

    function ReplacePlaceHolder($v, $arr)
    {

    $v = preg_replace ('/({(.*)})/eU', "isset($arr['\2'])?$arr['\2']:'\1'",$v);

    return $v;
    }

    echo ReplacePlaceHolder($text, $test);

    ?>

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Moin lulu

      Eine einfache Möglichkeit wäre der e-modifier (eval).

      Hui, das klappt tatsächlich :)

      Meine Zeile sieht jetzt so aus:
      $bla = preg_replace("!{{(.*)}}!eU", "$_POST[$1]", $string);

      Damit funktioniert es.
      In eine Funktion werde ich es so oder so noch packen müssen, da sind noch eine Menge mehr Abfragen und Anpassungen nötig. So ist zumindest schon mal der Anfang geschafft.

      Danke dir,
      dbenzhuser