PHP json扫描转义字符

时间:2014-09-03 07:06:21

标签: php json escaping

我正在写一个JSONScanner类,它基本上接受一个字符串并扫描整个事物来构造JSONObject。目前我正在编写read_string()方法来读取字符串。当读取一个逃脱' \'的字符串时,我得到一些无效的输出。

这是我的JSONScanner班级

class JSONScanner {
    private $in;
    private $pos;

    public function __construct($in) {
        $this->in = $in;
        $this->pos = 0;
    }

    #########################################################
    ############### Method used for debugging ###############
    #########################################################
    public function display() {
        $this->pos = 1;
        echo $this->read_string($this->get_char());
    }
    #########################################################
    #########################################################

    private function read_string($quote) {
        $str = "";

        while(($c = $this->get_char()) != $quote) {
            if($c == '\\') {
                $str .= $this->get_escaped_char();
            } else {
                $str .= $c;
            }
        }

        return $str;
    }

    private function get_escaped_char() {
        $c = $this->get_char();

        switch($c) {
            case 'n':
                return '\n';
            case 't':
                return '\t';
            case 'r':
                return '\r';
            // display the characters being escaped
            case '\\':
            case '\'':
            case '"':
            default:
                return $c;
        }
    }

    private function get_char() {
        if($this->pos >= strlen($this->in)) {
            return -1; // END OF INPUT
        }

        return substr($this->in, $this->pos++, 1);
    }
}

这是我正在运行的代码

$str = '{"a\\":1,"b":2}';
$jscan = new JSONScanner($str);
$jscan->display();

上面的字符串,我得到

a":1,

然而,当我尝试

$str = '{"a\\\":1,"b":2}';
$jscan = new JSONScanner($str);
$jscan->display();

我得到了我需要的东西,

a\

为什么我需要输入2个反斜杠来逃避1个反斜杠?

编辑:

我在json_decode上尝试了相同的json字符串,它给了我相同的结果,带有2个反斜杠,只有3个后退,它给了我a\。这是为什么?不能反复使用反斜杠需要连续2次\\

1 个答案:

答案 0 :(得分:2)

$str = '{"a\\":1,"b":2}';

这是一个PHP字符串文字,它有自己的转义规则。您使用上述代码表示的实际字符串是:

{"a\":1,"b":2}

如果要在PHP字符串文字中表示一个反斜杠,则需要编写两个反斜杠。所以你想要的正确的字符串表示是:

$str = '{"a\\\\":1,"b":2}';

它恰好使用三个反斜杠,因为\\变为一个\而下一个\后面没有任何特殊字符,所以它本身也代表一个反斜杠