Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  php  >  正文 PHP验证身份证格式

PHP验证身份证格式

发布时间:2020-10-27   编辑:www.jquerycn.cn
jquery中文网为您提供PHP验证身份证格式等资源,欢迎您收藏本站,我们将为您提供最新的PHP验证身份证格式资源
互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的。几乎都是在网上买一些大的互联网公司的一些认证服务。即使是便宜一些的认证价格也达到了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 false;             }             // 省市县(6位)             $areaNum = substr($num, 0, 6);             // 出生年月(6位)             $dateNum = substr($num, 6, 6);          } else if ($length == 18) { //如果是18位身份证              //基本格式校验             if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {                 return false;             }             // 省市县(6位)             $areaNum = substr($num, 0, 6);             // 出生年月日(8位)             $dateNum = substr($num, 6, 8);          } else { //假身份证             return false;         }          //验证地区         if (!self::isAreaCodeValid($areaNum)) {             return false;         }          //验证日期         if (!self::isDateValid($dateNum)) {             return false;         }          //验证最后一位         if (!self::isVerifyCodeValid($num)) {             return false;         }          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;         } else {             return false;         }     }      /**      * 验证出生日期合法性      * @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(substr($date, 6, 2));          //日期基本格式校验         if (!checkdate($month, $day, $year)) {             return false;         }          //日期格式正确,但是逻辑存在问题(如:年份大于当前年)         $currYear = date('Y');         if ($year > $currYear) {             return false;         }         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 false;             }         }         return true;     } }

使用示例:

// 测试 $num = '33071919610920021X'; if (IdentityCard::isValid($num)) {     echo '身份证格式正确'; } else {     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。

以上就是PHP验证身份证格式的详细内容,更多请关注jquery中文网其它相关文章!

  • 本文转载于:博客园,如有侵犯,请联系jquerycn@qq.com删除
  • 您可能感兴趣的文章:
    常用js验证代码大全(Email、手机号码、身份证号码、文件类型等)
    js身份证验证代码 支持15位和18位身份证
    PHP验证身份证格式
    php验证身份证号码正确性的示例代码
    正则表达式匹配字母 汉字 空格
    php判断是否为数字或字符类型的方法
    php导出csv时身份证号禁止科学计数
    网页验证码无法显示问题求解
    JS验证身份证有效性的实例代码
    php 正则表达式的一些方法小结

    [关闭]