上周收到了一个三手的Bug, 有用户发现虽然是成功交易却没有上传到服务器上,我估计这应该能从日志上查出原因,不知道为什么倒了这几手还没有结果。接着我从各种日志中进行排查,果然从终端上传最原始的数据中,发现有一个json的value值有<0x1d>这个字符,这个字符会在进行json字符串转json对象时出错,并造成后续的json对象的取值失败。这个<0x1d>从字符表里可以查到是一个控制字符,不知道是从那里引入的。
然后就想到正则替换本能过滤这个异常。
<?php
$str = '{"state":true,"info":{"MachineID":"M*******DBWW0<0x1d>C7073027","RandomNumber":"112233441******","DeviceType":"0"}';
$filteredString = preg_replace('/[\x00-\x1F\x7F].*?"/', '"', $str);
$json_obj = json_decode($filteredString);
print_r($json_obj);
?>
以下是输出结果
(
[state] => 1
[info] => stdClass Object
(
[MachineID] => "M*******DBWW0
[RandomNumber] => 12233441******"
[DeviceType] => 0
)
)