我想要模拟 PHP 5.3.0 中实现的 json_encode
位掩码标志,这是我拥有的字符串:
$s = addslashes('O\'Rei"lly'); // O\'Rei\"lly
使用json_encode($s, JSON_HEX_APOS | JSON_HEX_QUOT)
输出如下:
"O\\\u0027Rei\\\u0022lly"
我目前正在使用PHP 5.3.0以前的版本进行以下操作:
str_replace(array('\\"', "\\'"), array('\\u0022', '\\\u0027'), json_encode($s))
or
str_replace(array('\\"', '\\\''), array('\\u0022', '\\\u0027'), json_encode($s))
哪个能正确输出相同的结果:
"O\\\u0027Rei\\\u0022lly"
我有些困惑,不明白为什么需要将单引号 (
'\\\''
或者 "\\'"
[排除引号]) 替换成 '\\\u0027'
而不是 '\\u0027'
。
这里是我正在尝试移植到 PHP < 5.3 的代码:
if (get_magic_quotes_gpc() && version_compare(PHP_VERSION, '6.0.0', '<'))
{
/* JSON_HEX_APOS and JSON_HEX_QUOT are availiable */
if (version_compare(PHP_VERSION, '5.3.0', '>=') === true)
{
$_GET = json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT);
$_POST = json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT);
$_COOKIE = json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT);
$_REQUEST = json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT);
}
/* mimic the behaviour of JSON_HEX_APOS and JSON_HEX_QUOT */
else if (extension_loaded('json') === true)
{
$_GET = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_GET));
$_POST = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_POST));
$_COOKIE = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_COOKIE));
$_REQUEST = str_replace(array(), array('\\u0022', '\\u0027'), json_encode($_REQUEST));
}
$_GET = json_decode(stripslashes($_GET));
$_POST = json_decode(stripslashes($_POST));
$_COOKIE = json_decode(stripslashes($_COOKIE));
$_REQUEST = json_decode(stripslashes($_REQUEST));
}
str_replace(array('\"', '\''), array('\\u0022', '\\u0027'), json_encode(addslashes('O\'Rei"lly')))
将始终产生与json_encode(addslashes('O\'Rei"lly'), JSON_HEX_APOS | JSON_HEX_QUOT)
相同的输出,对吗? - Alix Axel