PHP实现可精确验证身份证号码的工具类示例


Posted in PHP onMay 31, 2018

本文实例讲述了PHP实现可精确验证身份证号码的工具类。分享给大家供大家参考,具体如下:

<?php
class check_IdCard {
 // $num为身份证号码,$checkSex:1为男,2为女,不输入为不验证
 public function checkIdentity($num, $checkSex = '') { // 不是15位或不是18位都是无效身份证号
 if (strlen($num) != 15 && strlen($num) != 18) {
  return false;
 }
 // 是数值
 if (is_numeric($num)) {
  // 如果是15位身份证号
  if (strlen($num) == 15) {
  // 省市县(6位)
  $areaNum = substr($num, 0, 6);
  // 出生年月(6位)
  $dateNum = substr($num, 6, 6);
  // 性别(3位)
  $sexNum = substr($num, 12, 3);
  } else {
  // 如果是18位身份证号
  // 省市县(6位)
  $areaNum = substr($num, 0, 6);
  // 出生年月(8位)
  $dateNum = substr($num, 6, 8);
  // 性别(3位)
  $sexNum = substr($num, 14, 3);
  // 校验码(1位)
  $endNum = substr($num, 17, 1);
  }
 } else {
  // 不是数值
  if (strlen($num) == 15) {
  return false;
  } else {
  //验证前17位为数值,且18位为字符x
  $check17 = substr($num, 0, 17);
  if (!is_numeric($check17)) {
   return false;
  }
  //省市县(6位)
  $areaNum = substr($num, 0, 6);
  // 出生年月(8位)
  $dateNum = substr($num, 6, 8);
  // 性别(3位)
  $sexNum = substr($num, 14, 3);
  // 校验码(1位)
  $endNum = substr($num, 17, 1);
  if ($endNum != 'x' && $endNum != 'X') {
   return false;
  }
  }
 }
 //验证地区
 if (isset($areaNum)) {
  if (!$this->checkArea($areaNum)) {
  return false;
  }
 }
 //验证日期
 if (isset($dateNum)) {
  if (!$this->checkDate($dateNum)) {
  return false;
  }
 }
 // 性别1为男,2为女
 if ($checkSex == 1) {
  if (isset($sexNum)) {
  if (!$this->checkSex($sexNum)) {
   return false;
  }
  }
 } elseif ($checkSex == 2) {
  if (isset($sexNum)) {
  if ($this->checkSex($sexNum)) {
   return false;
  }
  }
 }
 //验证最后一位
 if (isset($endNum)) {
  if (!$this->checkEnd($endNum, $num)) {
  return false;
  }
 }
 return true;
 }
 // 验证城市
 private function checkArea($area) {
 $num1 = substr($area, 0, 2);
 $num2 = substr($area, 2, 2);
 $num3 = substr($area, 4, 2);
 // 根据GB/T2260—999,省市代码11到65
 if (10 < $num1 && $num1 < 66) {
  return true;
 } else {
  return false;
 }
 }
 // 验证出生日期
 private function checkDate($date) {
 if (strlen($date) == 6) {
  $date1 = substr($date, 0, 2);
  $date2 = substr($date, 2, 2);
  $date3 = substr($date, 4, 2);
  $statusY = $this->checkY('19' . $date1);
 } else {
  $date1 = substr($date, 0, 4);
  $date2 = substr($date, 4, 2);
  $date3 = substr($date, 6, 2);
  $nowY = date("Y", time());
  if (1900 < $date1 && $date1 <= $nowY) {
  $statusY = $this->checkY($date1);
  } else {
  return false;
  }
 }
 if (0 < $date2 && $date2 < 13) {
  if ($date2 == 2) {
  // 润年
  if ($statusY) {
   if (0 < $date3 && $date3 <= 29) {
   return true;
   } else {
   return false;
   }
  } else {
   // 平年
   if (0 < $date3 && $date3 <= 28) {
   return true;
   } else {
   return false;
   }
  }
  } else {
  $maxDateNum = $this->getDateNum($date2);
  if (0 < $date3 && $date3 <= $maxDateNum) {
   return true;
  } else {
   return false;
  }
  }
 } else {
  return false;
 }
 }
 // 验证性别
 private function checkSex($sex) {
 if ($sex % 2 == 0) {
  return false;
 } else {
  return true;
 }
 }
 // 验证18位身份证最后一位
 private function checkEnd($end, $num) {
 $checkHou = array(1, 0, 'x', 9, 8, 7, 6, 5, 4, 3, 2);
 $checkGu = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 $sum = 0;
 for ($i = 0;$i < 17;$i++) {
  $sum+= (int)$checkGu[$i] * (int)$num[$i];
 }
 $checkHouParameter = $sum % 11;
 if ($checkHou[$checkHouParameter] != $num[17]) {
  return false;
 } else {
  return true;
 }
 }
 // 验证平年润年,参数年份,返回 true为润年 false为平年
 private function checkY($Y) {
 if (getType($Y) == 'string') {
  $Y = (int)$Y;
 }
 if ($Y % 100 == 0) {
  if ($Y % 400 == 0) {
  return true;
  } else {
  return false;
  }
 } else if ($Y % 4 == 0) {
  return true;
 } else {
  return false;
 }
 }
 // 当月天数 参数月份(不包括2月) 返回天数
 private function getDateNum($month) {
 if ($month == 1 || $month == 3 || $month == 5 || $month == 7 || $month == 8 || $month == 10 || $month == 12) {
  return 31;
 } else if ($month == 2) {
 } else {
  return 30;
 }
 }
}
// 测试
header("content-type:text/html;charset=utf-8");
$num = '230106199202099035'; //此号码为随机生成
$test = new check_IdCard();
$data = $test->checkIdentity($num);
var_dump($data);
//=============新的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。

运行结果:

bool(true)

PHP 相关文章推荐
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
laravel容器延迟加载以及auth扩展详解
Mar 02 PHP
Laravel 5框架学习之表单
Apr 08 PHP
php常量详细解析
Oct 27 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
php异常处理捕获错误整理
Sep 23 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 #PHP
php curl获取到json对象并转成数组array的方法
May 31 #PHP
php插入mysql数据返回id的方法
May 31 #PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 #PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 #PHP
php 获取xml接口数据的处理方法
May 31 #PHP
thinkPHP框架中执行事务的方法示例
May 31 #PHP
You might like
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
比较完整的微信开发php代码
2016/08/02 PHP
laravel 数据验证规则详解
2019/10/23 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
在网页中控制wmplayer播放器
2006/07/01 Javascript
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Scrapy框架使用的基本知识
2018/10/21 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
财务会计人员岗位职责
2013/11/30 职场文书
大学新生军训自我鉴定
2014/03/18 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
岗位明星事迹材料
2014/05/18 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
车间统计员岗位职责
2015/04/14 职场文书
八一建军节主持词
2015/07/01 职场文书
汽车销售员工作总结
2015/08/12 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
vue动态绑定style样式
2022/04/20 Vue.js