Der Martin: Backslash entfernen

Beitrag lesen

Hi,

$mail_text = preg_replace('/\\'/', "'", $mail_text);

$mail_text = preg_replace('/\\"/', '"', $mail_text);


>   
> \" aaaaa '  
>   
> D.h. vor dem ' wird der Backslash entfernt, vor dem " nicht.  
> Was ist da noch falsch?  
  
dazu muss man etwas weiter ausholen, nämlich bis zur String-Notation in PHP.  
In PHP kann man Stringkonstanten in 'einzelne' oder "doppelte" Anführungszeichen setzen. Das ist aber ein Bedeutungsunterschied: In double-quoted Strings werden viele Steuerzeichen und Escape-Sequenzen interpretiert, etwa \r, \n, \t, außerdem werden eingebettete Variablen aufgelöst. In single-quoted Strings passiert das alles nicht, die einzigen Sonderfälle, die hier beachtet werden, sind \' (sonst könnte ein einfaches Anführungszeichen nicht Teil des Strings sein) und \\, denn da der Backslash als Escape-Zeichen dient (wenn auch nur in einem Fall), muss er selbst auch escapet werden.  
  
Also dröseln wir die beiden Strings mal auf:  
  
'/\\\\\'/'   Ein forward slash /, ein Backslash \\, noch ein Backslash \\, ein Apostroph \',  
             ein forward slash /  
             Ergibt intern:  /\\'/  
'/\\\\\"/'   Ein forward slash /, ein Backslash \\, noch ein Backslash \\, ein Backslash \,  
             ein Anführungszeichen ", ein forward slash /  
             Ergibt intern:  /\\\"/  
  
Bemerkenswert ist eigentlich nur, dass in der Kombination \" im zweiten Beispiel der Backslash "wörtlich" genommen wird. Das liegt daran, dass die Kombination \" in single-quoted Strings nicht als Escape-Sequenz definiert ist (das Anführungszeichen kannst und musst du unmaskiert schreiben), und deshalb beide Zeichen "wörtlich" gelten.  
  

> Und kann mir jemand erklären wie diese vielen \ zu erklären sind.  
  
Ja. Es liegt an der zweifachen Verdopplung. Gehen wir rückwärts vor:  
Damit die RegEx-Engine einen echten Backslash versteht und nicht eine mit dem Backslash eingeleitete Escape-Sequenz, muss dieser verdoppelt werden. Also müssen schon mal zwei Backslashes an die RegEx-Engine übergeben werden.  
Um einen Backslash in einem PHP-String zu notieren, muss er verdoppelt werden. Um zwei Backslashes in einem PHP-String zu notieren, müssen beide verdoppelt werden.  
Übrig bleibt der falsch verwendete fünfte Backslash im zweiten Beispiel.  
  
So long,  
 Martin  

-- 
Zwischen Leber und Milz  
passt immer noch'n Pils.  
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(