preg_replace fügt Slashes ein, wenn der e-Modifier (EVAL Modifier) aktiv ist
05.04.2008
Author: N43
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 Ausgabefunction call($arg) {
return $arg;
}
$text = 'preg [call]escapes " me[/call]';
echo preg_replace(
'#\[call](.*?)\[/call]#e',
"call('$1')",
$text) . "\n";
?>
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]';
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 manZitat:
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]';
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:
Sei der Erste und teile uns Deine Meinung mit.
Kommentare