Christian Kruse: Mal wieder ein RegEx-Problem

Beitrag lesen

Hallo Achim,

/[([bi]):(.*?[^\])]/

Das kann aber nicht funktionieren.

Es kann :)

In PHP zumindest scheint der zweite Slash bei [^\] die
eckige Klammer zu quoten. Fehler: missing terminating ]
for character class at offset 20

Da bist du dem typischen PHP-Programmierer-Fehler
aufgesessen. Du uebergibst der RegEx-Engine einen String,
also musst du escapen:

preg_replace("/\[([bi]):(.*?[^\\])\]/",....);

Vorhin hatte ich das schon mit drei Slashes. Das geht
schonmal, aber dann habe ich im Text immer noch die "]"
übrig. Ich könnte noch eine Substitution machen und alle
"]" in ] umsetzen.

Dafuer gibt es den e-Flag. Du musst halt den String, den du
im Ersetzungsteil bekommst, per str_replace() oder so
saeubern, z. B. so:

preg_replace("/\[([bi]):(.*?[^\\])\]/e","str_replace($1,'\]',']');",$txt);

kann sein, dass du das $1 noch in '' schreiben musst.

Gruesse,
 CK