Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中验证java时间戳_Php_Regex_Numbers - Fatal编程技术网

在PHP中验证java时间戳

在PHP中验证java时间戳,php,regex,numbers,Php,Regex,Numbers,我有一个基于php的API,它接受来自Android设备(read-Java)的上传。数据采用JSON格式,其中一个字段是java时间戳,例如1421100231554。PHP代码正在使用以下(简化)代码(相当简单地)检查此时间戳的有效性: 这个check\u num函数是从许多不同的地方调用的 后来,使用此代码使用此时间戳将数据插入数据库(这一部分与本问题的目的几乎无关) 这对我来说效果很好——直到我们将主机从Fedora4(不问)迁移到最新的CentOS。现在此代码停止工作,因为preg_m

我有一个基于php的API,它接受来自Android设备(read-Java)的上传。数据采用JSON格式,其中一个字段是java时间戳,例如
1421100231554
。PHP代码正在使用以下(简化)代码(相当简单地)检查此时间戳的有效性:

这个
check\u num
函数是从许多不同的地方调用的

后来,使用此代码使用此时间戳将数据插入数据库(这一部分与本问题的目的几乎无关)

这对我来说效果很好——直到我们将主机从Fedora4(不问)迁移到最新的CentOS。现在此代码停止工作,因为
preg_match('/^\d+$/',$data['timestamp'])
正在返回
0
。我开始深入研究,结果发现PHP正在将13位数字转换成科学符号,即
1.42110023155E+12
。这显然使模式匹配器失效

时间戳以数字而不是字符串的形式出现,也就是说,相关的JSON片段是:

[
  {
     "timestamp":1421100231554,
     "customer":100274,
     "type":"warehouse",
     "items":[...]
  }
]
我对发送数据的Android应用程序没有任何控制权,因此我必须进行的任何调整都必须在PHP的服务器端进行


如何修复PHP代码以使其再次正常工作?

对不起,您最后的评论…:)

然后试试看

$i = gmp_init( $number );
$timestamp = gmp_strval( $i );

关于这一点,有两个学派:

如果使用选项中设置的
JSON\u BIGINT\u AS\u STRING
标志调用,则它应将任何太大而无法表示为int的整数作为字符串传回。这应保持精度:

$myJson = '{"time":71055011577700000000}'; // too big to fit into 64-bit int
$myobj = json_decode($myJson,false,512,JSON_BIGINT_AS_STRING);
var_dump($myObj);

object(stdClass)#1 (1) {
  ["time"]=>
  string(20) "71055011577700000000"
}
另一种观点是,不应该对数值使用正则表达式来确定它们是否在指定的范围内。用数学。。。关于数字。革命,我知道:

if ($data['timestamp'] > 1e14) {
    die('more than 13 digits in your int!');
} elseif ($data['timestamp'] < 1) {
    die('your int is too small');
}
if($data['timestamp']>1e14){
die('int中超过13位!');
}elseif($data['timestamp']<1){
die('您的int太小');
}

if(is_int($data['timestamp'])
应该这样做。@安非他命机器它不一样-它不检查13位数字。正如我所说的,我在很多地方都调用了这个函数,在那里我指定了数字的预期长度。他没有ctrl键
json\u decode($jsonstring,false,512,json\u BIGINT\u As\u STRING)
也会这样做。我得到错误
PHP警告:gmp\u strval():无法将变量转换为GMP-输入错误-在第1行
@安非他明这就成功了!我更新了我的代码,但安非他明解决方案似乎是一个很好的标志,
json\u decode
做到了。至于用数学来检查数字,是的,这是正确的方法,但是我正在使用其他人的代码,我不想开始修复其他有效的东西;考虑到我们正在从PHP5.1迁移到PHP5.4,我已经有足够多的问题了——旧服务器已经好几年没有更新了。
$myJson = '{"time":71055011577700000000}'; // too big to fit into 64-bit int
$myobj = json_decode($myJson,false,512,JSON_BIGINT_AS_STRING);
var_dump($myObj);

object(stdClass)#1 (1) {
  ["time"]=>
  string(20) "71055011577700000000"
}
if ($data['timestamp'] > 1e14) {
    die('more than 13 digits in your int!');
} elseif ($data['timestamp'] < 1) {
    die('your int is too small');
}