preg_replace fügt Slashes ein, wenn der e-Modifier (EVAL Modifier) aktiv ist

05.04.2008

Wenn man in einem regulären Ausdruck den e-Modifier setzt, so wird der replacement Text durch die eval() Funktion gejagt. Treten in einer Back-Reference nun Anführungszeichen (einfache ' oder doppelte ") auf, so werden diese von preg_replace automatisch escaped.

Dadurch liefert z.B. folgender Code

PHP - Code:
<?php
 
    function call($arg) {
        return $arg;
    }
 
    $text = 'preg [call]escapes " me[/call]';
    echo preg_replace(
                '#\[call](.*?)\[/call]#e',
                "call('$1')",
                $text) . "\n";
 
?>
die Ausgabe
Zitat:
preg escapes \" me


Die schnelle Lösung einfach stripslashes() in call($arg) einzufügen hat aber einen Nachteil.
PHP - Code:
    function call($arg) {
        return stripslashes($arg);
    }
 
    // und dies als neuer Text
    $text = 'preg [call]does not escape \\ me[/call]';

Die erwartete Ausgabe
Zitat:
preg does not escape \ me
erscheint nicht, stattdessen bekommt man
Zitat:
preg does not escape me


Es muss also eine eigene Funktion her, die nur die \ vor " wieder entfernt
PHP - Code:
    function preg_stripslashes($text) {
        return str_replace('"', '"', $text);
    }
 
    function call($arg) {
        return preg_stripslashes($arg);
    }
 
    // und als neuer Text
    $text = 'preg [call]does not escape \\ me, but " me[/call]';

Was nun die gewünschte Ausgabe
Zitat:
preg does not escape \ me, but " me
liefert.


In dem Beispiel wurde $1 in ' eingeschlossen. Möchte man die Back-References mit " umschließen, so muss man im gesamten Text ' mit " ersetzen und umgekehrt.

Es ist allerdings nicht sehr empfehlenswert die Referenzen mit " zu umschließen, da dadurch Code eingeschleust werden kann.

Deine Meinung ist gefragt:


Es wurden noch keine Kommentare geposted.

Sei der Erste und teile uns Deine Meinung mit.

Einen neuen Kommentar erstellen...