If you need JS escaping function, use json_encode() instead.
(PHP 4, PHP 5, PHP 7, PHP 8)
addcslashes — Ajoute des slash dans une chaîne, à la mode du langage C
$string
, string $characters
) : string
Retourne la chaîne string
, après avoir ajouté des
antislashs devant tous les caractères qui sont présents
dans la liste characters
.
string
La chaîne à échapper.
characters
Une liste de caractères à échapper. Si
characters
contient les caractères
\n
, \r
etc., ils seront
convertis à la mode du langage C, alors que les autres
caractères non-alphanumériques ayant un code ASCII inférieur
à 26, et supérieur à 126 sont remplacés par leur représentation
octale.
Lorsque vous définissez une séquence de caractères
dans le paramètre characters
, assurez-vous
que vous connaissez bien tous les caractères qui viennent entre
vos limites d'intervalles.
<?php
echo addcslashes('foo[ ]', 'A..z');
// Affiche : \f\o\o\[ \]
// Toutes les majuscules et minuscules seront échappées
// ... mais aussi les caractères [\]^_`
?>
<?php
echo addcslashes("zoo['.']", 'z..A');
// Affiche : \zoo['\.']
?>
Attention à l'utilisation des caractères tels que 0, a, b, f, n, r,
t et v. Ils seront convertis en \0, \a, \b, \f, \n, \r, \t et \v,
tous étant des séquences d'échappement en C. La plupart de ces séquences
sont aussi définies dans d'autres langages dérivés du C, incluant PHP,
ce qui signifie que vous n'obtiendrez pas le résultat attendu si vous
utilisez la sortie de la fonction addcslashes()
pour générer du code pour ces langages avec les caractères définis
dans le paramètre characters
.
Retourne la chaîne, échappée.
characters
peut s'écrire "\0..\37", ce qui
identifie tous les caractères ASCII dont le code est entre
0 et 37.
Exemple #1 Exemple avec addcslashes()
<?php
$escaped = addcslashes($not_escaped, "\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>