<?php
// check
class CheckCard{// $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;}}}else if($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到65if(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;}}/*** 香港身份证校验* @param string $number 香港身份证号码* @author mosishu* @return array 正确时返回true状态和身份证号码,错误时返回false状态*/public function checkHKIdCard($number){//将中文括号全部替换成英文括号if (strpos($number,"(") || strpos($number,")")){$number = str_replace('(', '(', $number);$number = str_replace(')', ')', $number);}if(strlen($number)!=10){return array('status'=>false);}$one = substr($number,0,1);//取首字母$two = substr($number,1,1);//取第二位$three = substr($number,2,1);//取第三位$four = substr($number,3,1);//取第四位$five = substr($number,4,1);//取第五位$six = substr($number,5,1);//取第六位$seven = substr($number,6,1);//取第七位$checkCode = substr($number,-2,1);//取括号内的校验码$sixNum = substr($number, 1,6);//取中间六位数字if (preg_match('/^[A-Z]+$/', $one)){//第一位要是大写字母if ( is_numeric($sixNum)){//中间六位要是数字$sum = $this->letterNum[$one]*8+$two*7+$three*6+$four*5+$five*4+$six*3+$seven*2;$residue = $sum%11;if ($residue==1){$checkIdCode='A';}elseif($residue==0){$checkIdCode=0;}else{$checkIdCode=11-$residue;}if ($checkCode==$checkIdCode){return array('status'=>true,'sfz_id'=>$number);}else{return array('status'=>false);}}else{return array('status'=>false);}}else{return array('status'=>false);}}//香港身份证首字母对应的数字private $letterNum = array('A'=>1,'B'=>2,'C'=>3,'D'=>4,'E'=>5,'F'=>6,'G'=>7,'H'=>8,'I'=>9,'J'=>10,'K'=>11,'L'=>12,'M'=>13,'N'=>14,'O'=>15,'P'=>16,'Q'=>17,'R'=>18,'S'=>19,'T'=>20,'U'=>21,'V'=>22,'W'=>23,'X'=>24,'Y'=>25,'Z'=>26,);}

调用过程如下,我这里用的是Thinkphp框架:

        //验证身份证合法性vendor('CheckCard.CheckCard');$CheckCard=new \CheckCard();$idCode = $CheckCard->checkIdentity($sfz_id);$HKCode = $CheckCard->checkHKIdCard($sfz_id);if(!$idCode && !$HKCode['status']){$this->error('身份证不合法,请重试!');}

PHP验证身份证类(包含香港身份证校验)相关推荐

  1. 围观新版香港身份证与OCR识别完美搭配

    香港之前版本身份证是从2003 年开始启用的,被称为第一代智能身份证.现在何为智能身份证呢?智能身份证的意思就是不仅仅是证明个人身份外,还能用于出入境的资料.个人电子证书.康乐及文化事务署图书证,还兼 ...

  2. 身份证、护照、军官证、户口本验证工具类

    身份证.护照.军官证.户口本验证工具类 public class CertificateValidUtils {/*** 中国公民身份证号码最小长度.*/public static final int ...

  3. Java 身份证号码验证工具类

    package cn.hlq.test;import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  4. Android 身份证、车牌号验证工具类

    /*** 正在表达式验证工具类(验证身份证.车牌号等)* * @author chenlin* */ public class ValidateUtil {/*** 验证str是否为正确的身份证格式* ...

  5. 关于香港身份证有效性和格式的一套标准校验

    前几天项目中有个input输入框要求是用户输入香港的身份证号,那这就涉及到对输入的身份证号做校验,由于香港身份证号的特殊性,我们也可以直接判断它的有效性. 废话不多说,直接上代码: IsHKID(va ...

  6. 【SQLServer】验证身份证号第18位校验码是否合法

    目录 1.业务场景 2.知识前提 3.实现方案 4.测试 5.参考链接 1.业务场景 参考国家标准GB 11643-1999,居民身份证号组成:6位数字地址码+8位数字出生日期码+3位数字顺序码+1位 ...

  7. 身份证校验及其18岁判定(包含18位身份证和15位身份证)

    // IDCardVerifyDemo.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream> # ...

  8. Javascript 香港身份证号校验

    <!DOCTYPE html> <html><head><title>香港身份证校验码计算</title></head>< ...

  9. 利用正则来验证姓名、手机号、身份证号

    开发工具与关键技术:Visual Studio 2015 正则 作者:孙水兵 撰写时间:2019年6月27 一. 效果 二. 用到的方法 test:test 方法检查字符串是否与给出的正则表达式模式相 ...

最新文章

  1. 机房网络光纤扩容施工
  2. Oracle RAC禁用DRM
  3. 用于 Outlook 2003 的删除重复邮件的插件(加载项)
  4. 廖雪峰python学习笔记——函数式编程
  5. oracle dg物理和逻辑,Oracle DG 物理Standby环境搭建
  6. IDEA2021配置Tomcat
  7. pymysql单条插入数据和批量插入数据:
  8. Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化
  9. [集训队作业2018] 三角形(贪心,堆,线段树合并)
  10. Ubuntu 下安装JDK
  11. quarts集群 运维_Quartz.Net分布式运用
  12. Kafka在Linux下载安装及部署
  13. u盘启动蓝屏 索尼vaio_索尼笔记本如何设置u盘启动_索尼笔记本bios设置u盘启动教程介绍...
  14. ARP报文及其工作过程
  15. 我在蚂蚁金服做后端:那些坚持在一个岗位做八年的人,后来怎么样了?
  16. keepalived配置虚拟ip无法ping通解决方法
  17. Cocos2d-js cc.director介绍
  18. 关于Ride的基础认知
  19. 离散数学-3 命题逻辑的推理理论
  20. 分享129个ASP源码,总有一款适合您

热门文章

  1. 【SHELL】shell脚本入门
  2. 如何打开计算机任务管理器,电脑任务管理器怎么打开
  3. 占位符语法-Scala
  4. 比尔盖兹CES的最后语录
  5. ​定了,北京时间 9 月 16 日凌晨 1 点见。
  6. ffmpeg 裁剪、合并视频的多个部分
  7. Linux 基础入门 08
  8. C语言包含特殊寄存器文件ch,c语言第二次实验报告 - osc_zfz30hgc的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 【Hive】03-数据类型和文件格式
  10. Redis缓存穿透、击穿、雪崩、概念及解决办法