I am generating JSON with PHP.
I have been using
$string = 'This string has "double quotes"';
echo addslashes($string);
outputs: This string has \" double quotes\"
Perfectly valid JSON
Unfortunately addslashes also escapes single quotes with catastrophic results for valid JSON
$string = "This string has 'single quotes'";
echo addslashes($string);
outputs: This string has \'single quotes\'
In short, is there a way to only escape double quotes?
Although you should use json_encode
if it’s available to you, you could also use addcslashes
to add \
only to certain characters like:
addcslashes($str, '"\/')
You could also use a regular expression based replacement:
function json_string_encode($str) {
$callback = function($match) {
if ($match[0] === '\') {
return $match[0];
} else {
$printable = array('"' => '"', '\' => '\', "\b" => 'b', "\f" => 'f', "\n" => 'n', "\r" => 'r', "\t" => 't');
return isset($printable[$match[0]])
? '\'.$printable[$match[0]]
: '\u'.strtoupper(current(unpack('H*', mb_convert_encoding($match[0], 'UCS-2BE', 'UTF-8'))));
}
};
return '"' . preg_replace_callback('/\.|[^\x{20}-\x{21}\x{23}-\x{5B}\x{5D}-\x{10FFFF}/u', $callback, $str) . '"';
}
Answer:
Is there a PHP function that only adds slashes to double quotes NOT single quotes
There is no function like addslashes()
that only adds a slash to double quotes.
However you can make use of addcslashes()
to only add slashes to specific characters, e.g. only to double quotes:
addcslashes($string, '"');
That does exactly as described. If you want to have it compatible with stripcslashes()
however, you need to add the slash itself to the list of chars:
addcslashes($string, '"\');
That should do the job you’ve been asking for. I have no idea if that is compatible with json encoding.
Answer:
If you are generating JSON, why not just use the json_encode()
function ?
Answer:
function json_string_encode( $str ) {
$from = array('"'); // Array of values to replace
$to = array('\"'); // Array of values to replace with
// Replace the string passed
return str_replace( $from, $to, $str );
}
To use the function you simply need to use
$text = json_string_encode($text);