Hi,
war heute mal wieder ein bisschen am PHP programmieren und hab mit RegExen rumgespielt. Ich wollte bestimmte Elemente, die in {$ $} eingschlossen waren (also z.B. {$test$}) finden und durch nichts ersetzen.
Dafür schrieb ich mir das folgende RegEx:
#{\$(.*?)\$}#
An sich ein kleines, schnuckeliges RegEx, was auch tadellos funktioniert, zumindest auf den ersten Blick.
Als PHP-Code sah das ganze zu erst so aus (vereinfacht):
public function replacetags($input) {
$regex = "#{\$(.*?)\$}#";
return preg_replace($regex, '', $input);
}
Doch hoppla, egal was ich in den Input stopfte, es wurden nie meine {$ $} gelöscht. Zuerst dachte ich, dass es doch an der RegEx lag, weswegen ich es mit dem RegEx-Tool getestet hab, dort funktionierte es allerdings tadellos. Nach langem Probieren habe ich aus den doppelten Anführungszeichen ( ” ) ein einfaches ( ‘ ) gemacht und schwupps, funktionierte alles ohne Probleme.
Ich bin immer noch am Überlegen, warum es mit den doppelten Anführungszeichen nicht funktioniert, wohl aber mit den einfachen. Falls jemand die Lösung weiß oder einen Tipp hat, nur her damit
In PHP werden Variablen in doppelten Anführungszeichen ersetzt (wie auch das Highlighting schon zeigt).
$test = “Welt”;
echo “Hallo $test”;
gibt Hallo Welt aus.
Das ist soweit klar, aber im RegEx steckt ja keine Variable drin?
Ja, aber wegen der $-zeichen, denkt PHP, dass es sich um eine (bzw zwei) Variablen handelt. Weil die aber nicht existieren, also “leer sind”, setzt PHP den Inhalt der nicht existierenden Variablen, also gar nichts, ein -> die $ verschwinden.
PHP ist etwas merkwürdig was die Verwaltung von Variablen und Werten angeht.
Beispiel:
if (!$variable) ergibt true, wenn die variable 0, NULL oder ” ist, oder auch wenn sie gar nicht existiert…
Ach natürlich klar. Oh Gott, das hab ich total übersehen, dass er $ als Variable sieht.
Danke fürs Augenöffnen
deshalb nimmt man auch keine $ als deliminatoren