当前位置: 首页 > news >正文

php验证身份证合法性


<?
//php验证身份证合法性
// 计算身份证校验码,根据国家标准GB 11643-1999
class Util{
	static function idcard_verify_number($idcard_base){
    if (strlen($idcard_base) != 17){ return false; }
    // 加权因子
    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

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

    $checksum = 0;
    for ($i = 0; $i < strlen($idcard_base); $i++){
        $checksum += substr($idcard_base, $i, 1) * $factor[$i];
    }

    $mod = strtoupper($checksum % 11);
    $verify_number = $verify_number_list[$mod];

    return $verify_number;
}
}


// 将15位身份证升级到18位
function idcard_15to18($idcard){
    if (strlen($idcard) != 15){
        return false;
    }else{
        // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
        if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false){
            $idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);
        }else{
            $idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);
        }
    }

    $idcard = $idcard . Util::idcard_verify_number($idcard);

    return $idcard;
}

//18位身份证校验码有效性检查
function idcard_checksum18($idcard){
    if (strlen($idcard) != 18){ return false; }
    $aCity = array(11 => "北京",12=>"天津",13=>"河北",14=>"山西",15=>"内蒙古",
    21=>"辽宁",22=>"吉林",23=>"黑龙江",
    31=>"上海",32=>"江苏",33=>"浙江",34=>"安徽",35=>"福建",36=>"江西",37=>"山东",
    41=>"河南",42=>"湖北",43=>"湖南",44=>"广东",45=>"广西",46=>"海南",
    50=>"重庆",51=>"四川",52=>"贵州",53=>"云南",54=>"西藏",
    61=>"陕西",62=>"甘肃",63=>"青海",64=>"宁夏",65=>"新疆",
    71=>"台湾",81=>"香港",82=>"澳门",
    91=>"国外");
    //非法地区
    if (!array_key_exists(substr($idcard,0,2),$aCity)) {
        return false;
    }
    //验证生日
    if (!checkdate(substr($idcard,10,2),substr($idcard,12,2),substr($idcard,6,4))) {
        return false;
    }
    $idcard_base = substr($idcard, 0, 17);
    if (Util::idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))){
        return false;
    }else{
        return true;
    }
}

	var_dump(idcard_checksum18('*****************'));
?> 

相关文章:

  • gcc/g++ 编译选项
  • Metro Style App 异步-简洁而不简单的异步
  • centos 7 环境变量PATH 、 cp命令、mv命令、 文档查看cat/more/less/head/tail
  • Oracle基本操作命令
  • 【Java学习笔记之三十四】超详解Java多线程基础
  • An unexpected exception has been detected in native code outside the VM
  • FFmpeg AVPacket和AVFrame区别
  • 我为什么选择Angular 2?
  • 安装OpenStack问题
  • Java 大写字母转下划线加小写字母
  • CCF 201503-3 节日
  • LVS专题-(1)LVS基本介绍
  • 杭电2054
  • 赵丽颖人生第一次演讲——我小小的英雄主义,用行动证明坚持的意义
  • zabbix snmp 监控Esxi6.0 无法开启snmp服务
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [Vue CLI 3] 配置解析之 css.extract
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【5+】跨webview多页面 触发事件(二)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【技术性】Search知识
  • CentOS7简单部署NFS
  • Docker下部署自己的LNMP工作环境
  • E-HPC支持多队列管理和自动伸缩
  • Git的一些常用操作
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MaxCompute访问TableStore(OTS) 数据
  • MYSQL 的 IF 函数
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • text-decoration与color属性
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue 配置sass、scss全局变量
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 精彩代码 vue.js
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深度学习在携程攻略社区的应用
  • 温故知新之javascript面向对象
  • 线性表及其算法(java实现)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一道面试题引发的“血案”
  • 用jquery写贪吃蛇
  • 树莓派用上kodexplorer也能玩成私有网盘
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ***检测工具之RKHunter AIDE
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例