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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
NOT NULL 和NULL
Jan 15 PHP
防止MySQL注入或HTML表单滥用的PHP程序
Jan 21 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
php使用curl抓取qq空间的访客信息示例
Feb 28 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
php中try catch捕获异常实例详解
Aug 06 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购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
javascript数组去重常用方法实例分析
2017/04/11 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
js仿淘宝放大镜效果
2020/12/28 Javascript
查看python下OpenCV版本的方法
2018/08/03 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
Python 转换文本编码实现解析
2019/08/27 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
python查看数据类型的方法
2019/10/12 Python
python小白学习包管理器pip安装
2020/06/09 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
《老王》教学反思
2014/02/23 职场文书
临时租车协议范本
2014/09/23 职场文书
公司周年庆典致辞
2015/07/30 职场文书
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers