Tom: REGEX Backslash, "Einer kam durch"

Beitrag lesen

Hello,

$search=preg_replace("/[,;\\\\:.\\/]/" , " " , $search);

Damit der Maskierungs-Backslash aber durch PHP durchschlüpfen kann, muss er seinerseits maskiert werden.
Nein. Ich habe es mit der anderen Variante probiert: es läuft. Du musst doch den normalen Slash in PHP nicht maskieren. Aber im REGEX schon. Deshalb reicht ein Backslash vor dem Slash. PHP gibt ihn auch als einen Slash an REGEX weiter.

Doch! Dass es trotzdem funktioniert, liegt an dieser unseligen "Fuzzy-Logik" von PHP. Wenn die Kombination \x nicht bekannt ist als Sonderzeichen (x steht hier für beliebiges Zeichen), wird nur der \ weitergereicht und das Zeichen. Aber da \ bekannt ist, wird auch nur ein \ weitergereicht.

Einfacher würde es aussehen, wenn du
    $search=preg_replace('/[,;\:.\/]/' , ' ' , $search);
Das ist mir jetzt auch interessant: Wenn ich einfache Anführungszeichen verwende, brauche ich den Backslash nicht mehr zu maskieren? Ich dachte, die REGEX erfordert immer, dass ich den Backslash maskiere. Oder geht das hier, weil dem Backslash ein : folgt, welches nicht maskiert werden braucht?

Das probiere mal bitte aus. Hier gilt mMn das Gleiche unselige Fuzzy-Verhalten, wie bei PHP. Da : kein Sonderzeichen repräsentiert, wird mMn auch \ und : weitergereicht. Besser wäre es aber mWn, wenn Du \ schreiben würdest. Das hast Du wohl Recht, dass das sauberer wäre.

oder
    $search=preg_replace('~[,;\:./]~' , ' ' , $search);
schreiben würdest.

Ach, ich kann anstelle der / einfach ~ verwenden? Könnte ich theoretisch jeden Buchstaben verwenden?

Ja, Du kannst alle Zeichen verwenden, die keine Sonderbedeutung haben. Dann musst Du sie aber innerhalb des Musters escapen, wenn sie dann dort normal auftreten sollen. Der Backslash wäre daher eine sehr unglückliche Wahl...

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de