Perhaps the following is a more efficient JavaScript escape function:
<?php
function jsEscape($str) {
return addcslashes($str,"\\\'\"&\n\r<>");
}
?>
addcslashes
(PHP 4, PHP 5)
addcslashes — Dizgeye C tarzı öncelem uygular
Açıklama
dizge dizgesindeki karakterler değiştirgesinde listelenmiş karakterlerin önüne tersbölü yerleştirilerek elde edilen dizgeyi döndürür.
Değiştirgeler
- dizge
-
Öncelenecek dizge.
- karakterler
-
Önlerine tersbölü konulacak \n, \r gibi karakterleri içeren dizge. Belirtilen karakterler C tarzı öncelenirken, ASCII kodu 32'den küçük ve 126'dan büyük karakterler sekizlik gösterimlerine dönüştürülür.
Bu değiştirgede bir karakter aralığı belirtiyorsanız bu aralığın hangi karakterleri içerdiğine dikkat etmelisiniz.
<?php
echo addcslashes('foo[ ]', 'A..z');
// çıktısı: \f\o\o\[ \]
// Tüm büyük ve küçük harflerden başka [\]^_` karakterleri de öncelenir
?>Ayrıca, bir aralığın başlangıç karakterinin ASCII değeri son karakterininkinden büyükse ilk ve son karakter hariç bu aralıktaki hiçbir karakter öncelenmez. Bir karakterin ASCII değerini bulmak için ord() işlevini kullanın.
<?php
echo addcslashes("zoo['.']", 'z..A');
// çıktısı: \zoo['\.']
?>Karakterleri seçerken dikkatli olun: 0, a, b, f, n, r, t ve v karakterleri \0, \a, \b, \f, \n, \r, \t ve \v karakterlerine dönüştürülecektir. Bunların hepsi C tarzı öncelemde öntanımlı dizilimler olup PHP'de \0 (NULL), \r (satırbaşı), \n (satırsonu), \f (sayfa ileri), \v (düşey sekme) ve \t (yatay sekme) öntanımlı dizilimlerdir.
Dönen Değerler
Öncelenmiş dizge.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| 5.2.5 | \v ve \f öncelem dizilimleri eklendi. |
Örnekler
"\0..\37" gibi bir aralık ASCII kodu 0 ile 31 arasında kalan karakterlerin de öncelenmesini sağlayacaktır.
Örnek 1 - addcslashes() örneği
<?php
$öncelemli = addcslashes($öncelemsiz, "\0..\37!@\177..\377");
?>
Ayrıca Bakınız
- stripcslashes() - addcslashes ile öncelenmiş dizgeyi eski haline getirir
- stripslashes() - Bir dizgeden tersbölüleri ayıklar
- addslashes() - Özel karakterlerin önüne tersbölü yerleştirir
- htmlspecialchars() - Özel karakterleri HTML öğeleri haline getirir
- quotemeta() - Özel anlamı olan karakterleri tersbölü ile önceler
addcslashes
27-Jul-2009 12:33
12-Nov-2007 11:16
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.)
27-Oct-2007 12:34
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.
20-Jan-2005 08:35
Forgot to add something:
The only time you would likely use addcslashes() without specifying the backslash (\) character in charlist is when you are VALIDATING (not encoding!) a data string.
(Validation ensures that all control characters and other unsafe characters are correctly encoded / escaped, but does not alter any pre-existing escape sequences.)
You can validate a data string multiple times without fear of "double encoding". A single decoding pass will return the original data, regardless of how many times it was validated.)
20-Jan-2005 07:02
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.
31-May-2004 04:51
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>
17-May-2002 11:22
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.
