preg_match数字错误?

时间:2017-08-20 18:43:21

标签: php regex preg-match

我有一张表格,用户必须填写他的身份证号码。 Id卡的长度为16个字符。我想检查输入的字符串是否只有一个长度为16个字符的数字?

我有这段代码:

<?php
$nik=1234567891234567;

if(!preg_match('/^[1-9][0-9]{16}$/', $nik)){
    echo 'nooooo';
    exit;
}else{
    echo 'yesss';
    exit;
}
?>

结果会回复nooooo,它的正则表达式有什么问题吗?

1 个答案:

答案 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;
}

Here's a demo

这将匹配一个恰好包含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或类似的供应商来处理这个问题。