joene: String von $1 in preg_replace bearbeiten

Hallo zusammen

Ich habe einen String in der Form

[TAG]Lorem ipsum etc.[/TAG]

Mithilfe des Codes
$str = preg_replace("/\[TAG\](.*)\[\/TAG\]/Um","<TAG $1 TAG>",$str);
bring ich ihn in die Form

<TAG Lorem ipsum etc. TAG>

Meine Frage: Wie kann ich es anstellen, dass ich den Text zwischen [TAG] un [/TAG], d.h. den Inhalt von $1, mithilfe einer Funktion, z.B. htmlspecialchars(), bearbeiten kann, bevor er an der Stelle von $1 eingefügt wird.
Ich habe versucht, es so zu lösen

$str = preg_replace("/\[TAG\](.*)\[\/TAG\]/Um","<TAG ".htmlspecialchars($1)." TAG>",$str);

was einen Fehler ausgibt (Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /home/www/web275/html/index.php on line 98) und auch so

$str = preg_replace("/\[TAG\](.*)\[\/TAG\]/Um","<TAG ".htmlspecialchars("$1")." TAG>",$str);

Hier wir aber der Funktion nur der String "$1" mitgegeben, d.h. er wird nicht ersetzt.

Gibt es eine Möglichkeit, dies ohne einen Umweg über explode() zu lösen?

Vielen Dank schon im Vorraus

  1. Hi,

    Meine Frage: Wie kann ich es anstellen, dass ich den Text zwischen [TAG] un [/TAG], d.h. den Inhalt von $1, mithilfe einer Funktion, z.B. htmlspecialchars(), bearbeiten kann, bevor er an der Stelle von $1 eingefügt wird.

    preg_replace_callback, bzw. Modifier e.

    Btw., solche BBCode-Ersetzungen mittels regulärer Ausdrücke allein sind ziemlicher Quark, weil du damit kaum korrekte Verschachtelung etc. prüfen kannst.

    Wenn du was vernünftiges willst, dann bastle es nicht selber, sondern nimm gleich das hier: http://www.christian-seiler.de/projekte/php/bbcode/

    MfG ChrisB

    --
    The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
    1. Vielen Dank für deine Hilfe!
      Es klappt nun wunderbar!

      PS: Es handelte sich hier nicht eigentlich um BBCode. Ich habe das Beipiel einfach so gewählt, weil es dadurch (glaube ich) einfacher verständlich war. Die Funktion war auch eine von mir selbst definierte und so konnte ich deinen zweite Tipp nicht befolgen. Mit preg_replace_callback hats dann aber geklappt