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文件下载类
Dec 06 PHP
php中处理模拟rewrite 效果
Dec 09 PHP
php读取html并截取字符串的简单代码
Nov 30 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
smarty模板引擎中变量及变量修饰器用法实例
Jan 22 PHP
PHP实现多文件上传的方法
Jul 08 PHP
PHP经典实用正则表达式小结
May 04 PHP
yii2 commands模式以及配置crontab定时任务的方法
Aug 19 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作为网站开发语言的原因分享
2012/01/03 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
jquery一句话全选/取消全选
2011/03/01 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
Python中pygame安装方法图文详解
2015/11/11 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
python语言是免费还是收费的?
2020/06/15 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
煤矿班组长竞聘书
2014/03/31 职场文书
档案保密承诺书
2014/06/03 职场文书
全运会口号
2014/06/20 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
优秀高中学生评语
2014/12/30 职场文书
婚礼新人答谢词
2015/01/04 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js