问题描述:

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) . '"';
}
网友答案:

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.

网友答案:

If you are generating JSON, why not just use the json_encode() function ?

网友答案:
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);
相关阅读:
Top