我正在写一个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次\\
?
答案 0 :(得分:2)
$str = '{"a\\":1,"b":2}';
这是一个PHP字符串文字,它有自己的转义规则。您使用上述代码表示的实际字符串是:
{"a\":1,"b":2}
如果要在PHP字符串文字中表示一个反斜杠,则需要编写两个反斜杠。所以你想要的正确的字符串表示是:
$str = '{"a\\\\":1,"b":2}';
它恰好使用三个反斜杠,因为\\
变为一个\
而下一个\
后面没有任何特殊字符,所以它本身也代表一个反斜杠