addcslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

addcslashesStellt bestimmten Zeichen eines Strings ein "\" voran (wie in C)

Beschreibung

addcslashes(string $string, string $characters): string

Gibt eine Zeichenkette zurück, in der allen Zeichen, die in characters aufgeführt sind, ein "\" vorangestellt ist.

Parameter-Liste

string

Die zu maskierende Zeichenkette.

characters

Eine Liste der zu maskierenden Zeichen. Wenn characters Zeichen wie \n, \r etc. enthält, werden diese im C-Stil konvertiert, während andere nicht-alphanumerische Zeichen mit einem ASCII-Wert kleiner als 32 oder größer als 126 in ihre oktale Repräsentation umgewandelt werden.

Wenn im Parameter characters eine Folge von Zeichen definiert wird, sollte bekannt sein, welche Zeichen zwischen den Zeichen liegen, die als Anfang und Ende des Bereichs festgelegt wurden.

<?php
echo addcslashes('foo[ ]''A..z');
// Ausgabe:  \f\o\o\[ \]
// Alle groß- und kleingeschriebenen Buchstaben werden maskiert
// ... aber ebenfalls die Zeichen [\]^_`
?>
Es ist außerdem zu beachten, dass keine Sequenz erstellt wird, wenn das erste Zeichen einer Sequenz einen höheren ASCII-Wert hat, als das zweite. In diesem Fall werden nur das erste und das letzte Zeichen sowie Punkte maskiert. Um den ASCII-Wert eines Zeichens zu ermitteln, kann die Funktion ord() verwendet werden.
<?php
echo addcslashes("zoo['.']"'z..A');
// Ausgabe:  \zoo['\.']
?>

Besondere Vorsicht ist geboten, wenn die Zeichen 0, a, b, f, n, r, t und v maskiert werden sollen. Sie werden zu \0, \a, \b, \f, \n, \r, \t oder \v umgewandelt, die in C sämtlich vordefinierte Escape-Sequenzen sind. Viele dieser Sequenzen sind auch in anderen von C abgeleiteten Sprachen, einschließlich PHP, vordefiniert. Das bedeutet, dass möglicherweise nicht das gewünschte Ergebnis erreicht wird, wenn die Rückgabe von addcslashes() verwendet wird, um mit diesen in characters definierten Zeichen Code in diesen Sprachen zu erzeugen.

Rückgabewerte

Gibt die maskierte Zeichenkette zurück.

Beispiele

characters-Angaben wie "\0..\37" (oktal) bewirken ein Maskieren aller Zeichen mit einem ASCII-Code zwischen 0 und 31 (dezimal).

Beispiel #1 addcslashes()-Beispiel

<?php
$maskiert 
addcslashes($nicht_maskiert"\0..\37!@\177..\377");
?>

Siehe auch

add a note add a note

User Contributed Notes 8 notes

up
5
phpcoder at cyberpimp dot pimpdomain dot com
17 years ago
If you are using addcslashes() to encode text which is to later be decoded back to it's original form, you MUST specify the backslash (\) character in charlist!

Example:

<?php
  $originaltext
= 'This text does NOT contain \\n a new-line!';
 
$encoded = addcslashes($originaltext, '\\');
 
$decoded = stripcslashes($encoded);
 
//$decoded now contains a copy of $originaltext with perfect integrity
 
echo $decoded; //Display the sentence with it's literal \n intact
?>

If the '\\' was not specified in addcslashes(), any literal \n (or other C-style special character) sequences in $originaltext would pass through un-encoded, but then be decoded into control characters by stripcslashes() and the data would lose it's integrity through the encode-decode transaction.
up
4
stein at visibone dot com
15 years ago
addcslashes() treats NUL as a string terminator:

   assert("any"  === addcslashes("any\0body", "-"));

unless you order it backslashified:

   assert("any\\000body" === addcslashes("any\0body", "\0"));

(Uncertain whether this should be declared a bug or simply that addcslashes() is not binary-safe, whatever that means.)
up
3
natNOSPAM at noworrie dot NO_SPAM dot com
20 years ago
I have found the following to be much more appropriate code example:

<?php
$escaped
= addcslashes($not_escaped, "\0..\37!@\@\177..\377");
?>

This will protect original, innocent backslashes from stripcslashes.
up
2
glitchmr at myopera dot com
9 years ago
If you need JS escaping function, use json_encode() instead.
up
-2
Johannes
15 years ago
Be carefull with adding the \ to the list of encoded characters. When you add it at the last position it encodes all encoding slashes. I got a lot of \\\ by this mistake.

So always encode \ at first.
up
-2
vishal dot ceeng at gmail dot com
3 years ago
echo addcslashes("zoo['.']", 'z..A');

Above code will create an error as per below

Invalid '..'-range, '..'-range needs to be incrementing -
up
-21
ruben at intesys dot it
18 years ago
jsAddSlashes for XHTML documents:

<?php
header
("Content-type: text/xml");

print <<<EOF
<?xml version="1.0"?>
<html>
<head>
<script type="text/javascript">

EOF;

function
jsAddSlashes($str) {
   
$pattern = array(
       
"/\\\\/"  , "/\n/"    , "/\r/"    , "/\"/"    ,
       
"/\'/"    , "/&/"     , "/</"     , "/>/"
   
);
   
$replace = array(
       
"\\\\\\\\", "\\n"     , "\\r"     , "\\\""    ,
       
"\\'"     , "\\x26"   , "\\x3C"   , "\\x3E"
   
);
    return
preg_replace($pattern, $replace, $str);
}

$message = jsAddSlashes("\"<Hello>\",\r\n'&World'\\!");

print <<<EOF
alert("$message");
</script>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>

EOF;
?>
up
-25
Anonymous
19 years ago
<?php
function jsaddslashes($s)
{
$o="";
$l=strlen($s);
for(
$i=0;$i<$l;$i++)
{
 
$c=$s[$i];
  switch(
$c)
  {
   case
'<': $o.='\\x3C'; break;
   case
'>': $o.='\\x3E'; break;
   case
'\'': $o.='\\\''; break;
   case
'\\': $o.='\\\\'; break;
   case
'"'$o.='\\"'; break;
   case
"\n": $o.='\\n'; break;
   case
"\r": $o.='\\r'; break;
   default:
  
$o.=$c;
  }
}
return
$o;
}

?>
<script language="javascript">
document.write("<? echo jsaddslashes('<h1 style="color:red">hello</h1>'); ?>");
</script>

output :

<script language="javascript">
document.write("\x3Ch1 style=\"color:red\"\x3Ehello\x3C/h1\x3E");
</script>
To Top