我有一张表格,用户必须填写他的身份证号码。 Id卡的长度为16个字符。我想检查输入的字符串是否只有一个长度为16个字符的数字?
我有这段代码:
<?php
$nik=1234567891234567;
if(!preg_match('/^[1-9][0-9]{16}$/', $nik)){
echo 'nooooo';
exit;
}else{
echo 'yesss';
exit;
}
?>
结果会回复nooooo,它的正则表达式有什么问题吗?
答案 0 :(得分:1)
你想要的是这样的:
<?php
$nik=1234567891234567;
var_dump($nik);
if(preg_match('/^[1-9]\d{15}$/', $nik)){
echo "Contains only numbers";
exit;
}else{
echo "Contains non-numeric characters";
exit;
}
这将匹配一个恰好包含16个字符的字符串;第一个可以是1-9
,但其余的可以是任何数字。您的正则表达式/^[1-9][0-9]{16}$/
与范围1-9
中的字符匹配,然后匹配0-9
范围内的16个字符,总共17个字符。
此外,您的代码存在逻辑缺陷:您的数字大于32位系统上的最大整数值,如the documentation中所述。可以通过检查常量PHP_INT_MAX
来确定任何系统上的最大值。对于32位系统,这是2147483647
。这个字符少于16个,因此您的代码在32位系统上无法可靠运行。
此外,您的帖子说您是通过表单从用户那里获取此信息。在这种情况下,您将收到一个字符串,而不是整数。例如,如果您的字段名为nik
,那么您将使用$_POST['nik']
(对于POST表单)或$_GET['nik']
(对于GET表单)访问该信息。然后,只需将其用作字符串;无论如何,它不是一个真正的数字。
您正在检查16个字符的数字。这听起来像涉及信用卡的东西。 如果您正在进行信用卡处理,您应该知道服务器上处理卡存在重大安全隐患和合规性问题。我不能给你法律建议,如何正确处理信用卡对于这个网站来说是一个太广泛的主题。但我会这样说:如果这是信用卡数据,那么不希望以这种方式执行此操作,除非您对合规性问题,审核等有非常大的预算。您应该考虑使用PayPal,Stripe或类似的供应商来处理这个问题。