互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的。几乎都是在网上买一些大的互联网公司的一些认证服务。即使是便宜一些的认证价格也达到了10万次/万元。也就是一角钱一次了,还是挺贵哈。所以为了减少公司的开支,我们在拿到用户提交的身份证信息去认证前应该自己先检验一下身份证的格式,如果连最基本的身份证格式就不满足的话,我们完全可以直接驳回,不必走接下来的花钱认证流程了,而且也可以建立一个用户身份证表,把每次认证通过的数据存起来,以后每次都先从自己系统里的用户身份证表查询,查不到再去走认廉洁文化进校园内容证流程,最大化节省公司开支。
这里提供一个初步验证身份证格式的php身份证验证类。该类只提供一个静态方法isvalid
接口,使用起来也很简单,只需要使用identitycard::isvalid
即可验证。可以放到自己项目中当做工具类。该方法可以同时验证15位的老身份证和18位的新身份证格式
php版本: >=7.0.0
注: 如果php版本低于7.0版本只需要把类中方法的参数限制取消掉即可使用。
class identitycard{ /** * 校验身份证号是否合法 * @param string $num 待校验的身份证号 * @return bool */ public static function isvalid(string $num) { //老身份证长度15位,新身份证长度18位 $length = strlen($num); if ($length == 15) { //如果是15位身份证 //15位身份证没有字母 if (!is_numeric($num)) { return fal; } // 省市县(6位) $areanum = substr($num, 0, 6); // 出生年月(6位) $datenum = substr($num, 6, 6); } el if ($length == 18) { //如果是18位身份证 //基本格式校验 if (!preg_m房地产开发企业资质管理规定atch('/^\d{17}[0-9xx]$/', $num)) { return fal; } // 省市县(6位) $areanum = substr($num, 0, 6); // 出生年月日(8位) $datenum = substr($num, 6, 8); } el { //假身份证 return fal; } //验证地区 if (!lf::isareacodevalid($areanum)) { return fal; } //验证日期 if (!lf::isdatevalid($datenum)) { return fal; } //验证最后一位 if (!lf::isverifycodevalid($num)) { return fal; } return true; } /** * 省市自治区校验 * @param string $area 省、直辖市代码 * @return bool */ private static function isareacodevalid(string $area) { $provincecode = substr($area, 0, 2); // 根据gb/t2260—999,省市代码11到65 if (11 <= $provincecode && $provincecode <= 65) { return true; } el { return fal; } } /** * 验证出生日期合法性 * @param string $date 日期 * @return bool */ private static function isdatevalid(string $date) { if (strlen($date) == 6) { //15位身份证号没有年份,这里拼上年份 $date = '19'.$date; } $year = intval(substr($date, 0, 4)); $month = intval(substr($date, 4, 2)); $day = intval(su北京医学院有哪些bstr($date, 6, 2)); //日期基本格式校验 if (!checkdate($month, $day, $year)) { return fal; } //日期格式正确,但是逻辑存在问题(如:年份大于当前年) $curryear = date('y'); if ($year > $curryear) { return fal; } return true; } /** *法国罗浮宫 验证18位身份证最后一位 * @param string $num 待校验的身份证号 * @return bool */ private static function isverifycodevalid(string $num) { if (strlen($num) == 18) { $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; $tokens = ['1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2']; $checksum = 0; 繁体字文章 for ($i = 0; $i < 17; $i++) { $checksum += intval($num{$i}) * $factor[$i]; } $mod = $checksum % 11; $token = $tokens[$mod]; $lastchar = strtoupper($num{17}); if ($lastchar != $token) { return fal; } } return true; }}
使用示例:
// 测试$num = '33071919610920021x';if (identitycard::isvalid($num)) { echo '身份证格式正确';} el { echo '身份证格式不正确';}
下面是身份证编码各个部分的含义:
//=============新的18位身份证号码各位的含义:=======================//1-2位省、自治区、直辖市代码;11-65//3-4位地级市、盟、自治州代码;//5-6位县、县级市、区代码;//7-14位出生年月日,比如19670401代表1967年4月1日;//15-17位为顺序号,其中17位男为单数,女为双数;//18位为校验码,0-9和x,由公式随机产生。//举例://130503 19670401 0012这个身份证号的含义: 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001,2为验证码//===========15位身份证号码各位的含义:=======================//1-2位省、自治区、直辖市代码;//3-4位地级市、盟、自治州代码;//5-6位县、县级市、区代码;//7-12位出生年月日,比如670401代表1967年4月1日,这是和18位号码的第一个区别;//13-15位为顺序号,其中15位男为单数,女为双数;//与18位身份证号的第二个区别:没有最后一位的验证码。//举例://130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001。
本文发布于:2023-04-07 12:26:10,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/102c7c02b32691ddc6342e3187608aef.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP验证身份证格式.doc
本文 PDF 下载地址:PHP验证身份证格式.pdf
留言与评论(共有 0 条评论) |