您的位置 首页 php

PHP 验证身份证号码是否正确,不是简单的正则验证,防止用户乱填

首先我们看下身份证的组成(这里只说明18位)

身份证是由: 地址码(前六位数)、出生日期码(第七位至十四位)、顺序码(第十五位至十七位)、校验码(第十八位数) 组成

地址码(前六位数)
表示 编码 对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

出生日期码(第七位至十四位)
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

顺序码(第十五位至十七位)
表示在同一地址码所标识的区域范围,对同年、同月、同日出生的人编定的顺序号,顺序码奇数分配给男性,偶数分配给女性。

校验码(第十八位数)
根据国家标准GB 11643-1999

这里如何计算校验码是关键

  1. 先对前17位数字的权求和

    加权因子一共17位 [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];

    加权求和公式:

    S=(身份证上第1位*加权因子第1位)+…+(身份证上第17位*加权因子第17位)

  2. 计算模

    M=mod(S, 11)

  3. 通过模得到对应的校验码

    校验码数组: [‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’]

    M是对应校验码的数组索引 如:M=1 则校验码为0

下面是具体的计算方法

$cardid=’你的身份证号码’

// 只能是18位
if( strlen ($cardid)!=18){
return false;
}

// 取出前17位
$idcard_base = substr($cardid, 0, 17);

// 取出校验码
$verifycode = substr($cardid, 17, 1);

// 加权因子
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

// 校验码对应值
$verify_code_arr = array(‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’);

// 根据前17位计算校验码
$S= 0;
for($i=0; $i<17; $i++){
$S += substr($idcard_base, $i, 1)*$factor[$i];
}

// 取模
$mod = $S% 11;

// 比较校验码
if($verifycode == $verify_code_arr[$mod]){
echo ‘身份证号码正确’;

}else{
echo ‘身份证号码错误’;
}

文章来源:智云一二三科技

文章标题:PHP 验证身份证号码是否正确,不是简单的正则验证,防止用户乱填

文章地址:https://www.zhihuclub.com/149638.shtml

关于作者: 智云科技

热门文章

网站地图