<?php
// check
class check{
// $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到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;
}
} }

php类精确验证身份证号码的更多相关文章

  1. 具体验证身份证号码规则和姓名(汉字)的java代码

    一.验证汉字的正則表達式  /** 是否是汉字的正则 */  private String regexIsHanZi = "[\\u4e00-\\u9fa5]+";   * @pa ...

  2. php验证身份证号码的正确性

    /********************php验证身份证号码是否正确函数*********************/function is_idcard( $id ) {   $id = strto ...

  3. C#验证身份证号码

    一.18位的身份证号码 如:130429####%%%%00781.1~6位为地区代码,其中1.2位数为各省级政府的代码,3.4位数为地.市级政府的代码,5.6位数为县.区级政府代码.如13(河北省) ...

  4. php验证身份证号码正确性

    发布:JB01   来源:脚本学堂     [大 中 小] 分享一例php代码,用于验证身份证号码的正确性,用到了preg_match.preg_replace函数,有需要的朋友可以参考学习下.本文转 ...

  5. php 验证身份证号码

    身份证号码的结构 身份证号码是特征组合码,由17位数字本体码和一位校验码组成. 排列顺序从左至右依此为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码(前六位数) 表示编 ...

  6. js验证身份证号码是否合规

    需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 functio ...

  7. C#后台验证身份证号码的一个方法

    简单的调用了正则表达式进行简单的验证,记下来留着以后备用 if ((!Regex.IsMatch(txtID.Text, @"^(^\d{15}$|^\d{18}$|^\d{17}(\d|X ...

  8. js 精确验证身份证(地址编码、出生日期、校验位验证)

    //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCodeValid(code) { ::::::::::::::::: ...

  9. JS正则表达式验证身份证号码

    function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{1 ...

随机推荐

  1. numpy教程01---ndarray的创建

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  2. Java基础之浅谈集合

    Java基础知识.关于List.Set.Map接口的了解,以及ArrayList.LinkedList.HashSet.TreeSet.HashMap.TreeMap...

  3. JavaScript学习总结5-作用域

    由于所有的全局变量都会绑定到window上,如果不同的JS文件,使用了相同的全局变量,会造成冲突,可以把自己的代码全部放入及定义的唯一空间中,减少全局命名冲突问题

  4. VisualStudio安装步骤

    1.下载vs2017,点击安装 2.选择asp.net选项进行安装,如果需要其他的功能,可以选上 3.更改安装路径,尽量把文件安装在c盘以外的盘上,因为c盘是系统盘,安装的东西越多电脑会越卡.注意:不 ...

  5. ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)

    摘要:介绍在ubuntu16.04中从下载到安装成功的完整步骤.本文给出MATLAB R2017b(Linux系统)的完整安装包百度云盘下载地址,逐步介绍一种简单易行的安装方法,在桌面创建快捷方式,最 ...

  6. Docker部署PostgreSQL主从

    #准备 PostgreSQL12.3版本容器两台,部署参考https://www.cnblogs.com/zspwf/p/16113298.html 主库: 192.168.3.14:2200 从库: ...

  7. 创建第一个c程序

    创建,组织,生成 ,生成. 1.我们先创建一个win32项目. 文件->新建->项目->Visual C++ ->Win32   输入项目名称   选择项目保存位置 很重要的一 ...

  8. 一行代码如何隐藏 Linux 进程?

    开源Linux 长按二维码加关注~ 上一篇:IPv6技术白皮书(附PDF下载) 总有朋友问隐藏Linux进程的方法,我说你想隐藏到什么程度,是大隐于内核,还是小隐于用户.网上通篇论述的无外乎 hook ...

  9. 女朋友面试回来抱怨说会redis,面试官问了一堆redis

    Redis 优缺点及特点 什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,类似MemoryCache,整个数据库统统加载在内存当中进行操作,定期通过异步操 ...

  10. 透过实例demo带你认识gRPC

    摘要:gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法.在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用. 本文分享自华为云社区<gRPC介绍以及spri ...