有没有一个PHP函数只在双引号而不是单引号中添加斜杠

2022-08-30 12:51:54

我正在使用PHP生成JSON。

我一直在使用

$string = 'This string has "double quotes"';

echo addslashes($string);

输出:This string has \" double quotes\"

完全有效的 JSON

不幸的是,加号也会转义单引号,从而产生灾难性结果,以获得有效的JSON

$string = "This string has 'single quotes'";

echo addslashes($string);

输出:This string has \'single quotes\'

简而言之,有没有办法只转义双引号?


答案 1

尽管您应该使用json_encode(如果可用),但您也可以使用加号斜杠仅添加到某些字符,例如:\

addcslashes($str, '"\\/')

您还可以使用基于正则表达式的替换:

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) . '"';
}

答案 2

有没有一个PHP函数只在双引号而不是单引号中添加斜杠

没有像addassars()这样的函数只在双引号中添加斜杠。

但是,您可以使用addcslashes()仅将斜杠添加到特定字符,例如向双引号添加斜杠:

addcslashes($string, '"');

这与描述的完全一样。但是,如果你想让它与 stripcslashes() 兼容,你需要将斜杠本身添加到字符列表中:

addcslashes($string, '"\\');

这应该可以完成您一直要求的工作。我不知道这是否与json编码兼容。


推荐