How to properly escape JavaScript (JSON) strings in PHP scripts
by Alex Stylianos
This is a small script I wrote back in 2007. It has very few improvements since then, and it has proved to be a life saver over and over again.
There are several special characters usually escaped with back slashes, like the quote, double-quote, control characters \b \t \n \f \r and of course the back-slash itself. But this little script goes one step beyond that, it also escapes the inequality symbols < > which have a special meaning in HTML and they may cause problems if left unescaped.
So here it is, enjoy!
if (!function_exists('json_esc')) {
function json_esc($input, $esc_html = true) {
$result = '';
if (!is_string($input)) {
$input = (string) $input;
}
$conv = array("\x08" => '\\b', "\t" => '\\t', "\n" => '\\n', "\f" => '\\f', "\r" => '\\r', '"' => '\\"', "'" => "\\'", '\\' => '\\\\');
if ($esc_html) {
$conv['<'] = '\\u003C';
$conv['>'] = '\\u003E';
}
for ($i = 0, $len = strlen($input); $i < $len; $i++) {
if (isset($conv[$input[$i]])) {
$result .= $conv[$input[$i]];
}
else if ($input[$i] < ' ') {
$result .= sprintf('\\u%04x', ord($input[$i]));
}
else {
$result .= $input[$i];
}
}
return $result;
}
}
Example 1
echo json_esc('This is a "JSON" escaped string');
// outputs: This is a valid \"JSON\" escaped string
Example 2
echo 'if (error) alert("' . json_esc("Error: You've done it again.\tI told you to use a serious editor and not C:\\Program Files\\Windows\\notepad.exe") . '")';
// outputs: if (error) alert("Error: You\'ve done it again.\tI told you to use a serious editor and not C:\\Program Files\\Windows\\notepad.exe")
