首页 » Web技术 » PHP » 正文

介绍一种PHP中数组转json编码而不转义中文字符和 \ / 的方法

前些天弄微信公众号自定义菜单的时候,看的它的文档中json数据中文都没有转义过,当时用了一个最笨的方法,就是按它那种格式手动写出来,然后在接口调试那里直接生成了自定义菜单。今天偶然发现了一种PHP数组转json而不转义中文和 / \ 的方法,记录下来:

/**
 * 不转义中文字符和\/的 json 编码方法
 * @param array $arr 待编码数组
 * @return string
 */
function json_encode_no_zh($arr) {
	$str = str_replace ( "\\/", "/", json_encode ( $arr ) );
	$search = "#\\\u([0-9a-f]+)#ie";

	if (strpos ( strtoupper(PHP_OS), 'WIN' ) === false) {
		$replace = "iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))";//LINUX
	} else {
		$replace = "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))";//WINDOWS
	}

	return preg_replace ( $search, $replace, $str );
}

由于 PHP 5.5 之后弃用了 e ,会报错:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead

所有如果使用更高版本 PHP 的可以使用 preg_replace_callback 函数,参考下面的方法:

function json_encode_no_zh($arr) {
    $str = str_replace ( "\\/", "/", json_encode ( $arr ) );
    $search = "#\\\\u([0-9a-f]{4})#i";

    return preg_replace_callback($search, create_function('$matches', 'if (strpos(strtoupper(PHP_OS), "WIN") === false) return iconv("UCS-2BE", "UTF-8", pack("H4", $matches[1])); else return iconv("UCS-2", "UTF-8", pack("H4", $matches[1]));'), $str);
}

 

本文共 3 个回复

  • 相随 2015/12/07 12:19

    不错,感谢楼主。简洁。

  • 陌熙 2016/08/16 18:15

    如果中文中含有数字,则该方法把所有数字都去掉了

发表评论