If you need JS escaping function, use json_encode() instead.
(PHP 4, PHP 5, PHP 7, PHP 8)
addcslashes — Escapa una cadena al estilo de C
$str
, string $charlist
) : string
Devuelve un string con barras invertidas antes de los caracteres que
aparecen en el parámetro charlist
str
El string a escapar.
charlist
Una lista de caracteres que serán escapados. Si
charlist
contiene caracteres como
\n
, \r
etc., serán
convertidos al estilo de C, mientras que otros caracteres no alfanuméricos
con código ASCII inferior a 32 y superior a 126 serán convertidos a
representación octal.
Cuando se defina una secuencia de caracteres en el argumento charlist, asegúrese de conocer los caracteres que hay entre los caracteres de inicio y final del rango establecido.
<?php
echo addcslashes('foo[ ]', 'A..z');
// salida: \f\o\o\[ \]
// Serán escapadas todas las letras mayúsculas y minúsculas
// ... pero también [\]^_`
?>
<?php
echo addcslashes("zoo['.']", 'z..A');
// salida: \zoo['\.']
?>
Ojo si se opta por escapar los caracteres 0, a, b, f, n, r, t y
v. Estos se convertirán en \0, \a, \b, \f, \n, \r, \t and \v, que son todos
secuencias de escape predefinidas en C. Muchas de estas secuencias tambíen
están definidas en otros lenguajes derivados de C, incluyendo PHP, lo que significa
que no se podría obtener el resultado deseado si se usa la salida de
addcslashes() para generar código en tales lenguajes
con los caracteres definidos en charlist
.
Devuelve el string escapado.
Versión | Descripción |
---|---|
5.2.5 | Se añadieron las secuencias de escape \v y \f. |
Un rango en charlist
como "\0..\37", escaparía a todos los
caracteres con código ASCII entre 0 y 31.
Ejemplo #1 Ejemplo de addcslashes()
<?php
$escapado = addcslashes($no_escapado, "\0..\37!@\177..\377");
?>
If you need JS escaping function, use json_encode() instead.
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.)
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.
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.
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.
echo addcslashes("zoo['.']", 'z..A');
Above code will create an error as per below
Invalid '..'-range, '..'-range needs to be incrementing -
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;
?>
<?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>