<?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. Java报错:Unable to find setter method for attribute: [x]

    在学习JavaWeb JSTL与自定义标签时遇到的坑,用的老师给的代码结果直接原地报错:javax.servlet.ServletException: org.apache.jasper.Jasper ...

  2. python的编译和解释

    编译和解释 1.编译: 将源代码一次性转换成目标代码的过程 源代码 → 编辑器 →目标代码 →程序执行(同时程序输入)→结果输出 2.解释: 将源代码逐条转换成目标代码同时逐条运行的过程 源代码+程序 ...

  3. eclipse 执行main方法 错误: 找不到或无法加载主类

    检查环境变量是否正确 JAVA_HOME JAVA的实际安装目录 CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\ ...

  4. 巧用 background-clip 实现超强的文字动效

    最近,有同学询问,如何使用 CSS 实现如下效果: 看起来是个很有意思的动效. 仔细思考一下,要想实现这类效果,其实用到的核心属性只有一个 -- background-clip: text. 有意思的 ...

  5. Java语言学习day13--7月14日

    今日内容介绍1.循环练习2.数组方法练习 ###01奇数求和练习 * A: 奇数求和练习 * a: 题目分析 * 为了记录累加和的值,我们需要定义一个存储累加和的变量 * 我们要获取到1-100范围内 ...

  6. python selenium 多个页面对象类使用同一个webdriver(即只打开一个浏览器窗口)

    1 class BasePage(): 2 """selenium基类""" 3 4 def __init__(self, driver=N ...

  7. Django-ORM-连表正反操作

    一.A表男生,B表女生,C表关系 1通过A表查与某个男生有关系的所有女生 思想1:在A表中确认男生后,通过反查到C表,获取相关内容(QuerySet),然后再跨到B表获取所有女生信息. obj=mod ...

  8. CentOS 8迁移Rocky Linux 8手记

    前言 由于CentOS 8的支持已经到期了,.NET 6也不支持了,然后也无法升级,导致使用起来已经非常不便,无奈只有迁移服务器这个选项了. 选择发行版本一直是一个比较头疼的问题,首先我不是专门运维的 ...

  9. VSCODE调试时在cygwin.S中发生段错误

    起因: C++实现矩阵类和向量类 当看了我实现的矩阵类后,一个同学问我: 然后我就试了试1000维,结果运行时在cygwin.S里引发了奇奇怪怪的Segmentation fault,而且这个文件还是 ...

  10. Linux 多网卡bonding

    bonding 将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡.直接给两块网卡设置同一IP 地址是不可以的.通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的 ...