php类精确验证身份证号码
<?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类精确验证身份证号码的更多相关文章
- 具体验证身份证号码规则和姓名(汉字)的java代码
一.验证汉字的正則表達式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @pa ...
- php验证身份证号码的正确性
/********************php验证身份证号码是否正确函数*********************/function is_idcard( $id ) { $id = strto ...
- C#验证身份证号码
一.18位的身份证号码 如:130429####%%%%00781.1~6位为地区代码,其中1.2位数为各省级政府的代码,3.4位数为地.市级政府的代码,5.6位数为县.区级政府代码.如13(河北省) ...
- php验证身份证号码正确性
发布:JB01 来源:脚本学堂 [大 中 小] 分享一例php代码,用于验证身份证号码的正确性,用到了preg_match.preg_replace函数,有需要的朋友可以参考学习下.本文转 ...
- php 验证身份证号码
身份证号码的结构 身份证号码是特征组合码,由17位数字本体码和一位校验码组成. 排列顺序从左至右依此为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码(前六位数) 表示编 ...
- js验证身份证号码是否合规
需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 functio ...
- C#后台验证身份证号码的一个方法
简单的调用了正则表达式进行简单的验证,记下来留着以后备用 if ((!Regex.IsMatch(txtID.Text, @"^(^\d{15}$|^\d{18}$|^\d{17}(\d|X ...
- js 精确验证身份证(地址编码、出生日期、校验位验证)
//身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCodeValid(code) { ::::::::::::::::: ...
- JS正则表达式验证身份证号码
function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{1 ...
随机推荐
- pip导出项目依赖包名称及版本,再安装命令
A导出依赖 pip freeze >requirements.txt B导入安装依赖 pip install -r requirements.txt 使用下面的命令安装依赖能自动跳过安装错误的依 ...
- Python入门-多进程
1.获取本机CPU # 早期的CPU是单核:实现多个程序并行,在某一时间点,其实只有一个进程 # 后来硬件多核CPU:多个进程是并行执行. from multiprocessing import cp ...
- Arrays工具类与Collections工具类
Arrays工具类 : Arrays.sort():对指定数组进行排序,从小到大 Arrays.toString():返回数组的内容的字符串表示形式 Arrays.asList():数组转List,但 ...
- docker下将容器按照端口号分配
问题情境:现在有一个服务器主机,安装了docker,想给成员分配各自的容器,但不想成员通过宿主机进入容器.那么成员如何直接访问容器呢? 成员可以通过ip加端口号访问 因此,需要生成一个容器,将容器的2 ...
- 第一阶段:Java基础之数组
注意点: @Java语言是把数组当作一个"对象"来看待的 @把数组分为两部分看,一部分是数组的引用,放置在栈内存中,一部分是数组对象,放置在堆内存中 @数组的引用可以指向任何有效的 ...
- mysql server_id的用途(主从等结构中)
前言 我们都知道MySQL用server-id来唯一的标识某个数据库实例,并在链式或双主复制结构中用它来避免sql语句的无限循环.5.7需要同时设置server_id参数,8.0开始server_id ...
- 第十三届蓝桥杯省赛C/C++ B组
@(第十三届蓝桥杯省赛C/C++B组) A顺子日期 答案是1478 B顺子日期 答案14(如果012算的话) C刷题统计 数据范围1e18,所以不能直接暴力,先取余,再暴力剩下的 #include&l ...
- HCIE笔记-第十节-静态路由
协议 :标识 前方的目的网络 是通过什么协议形成的 优先级:代表形成路由的协议的优先级数值 [厂商规定] 开销值:代表该路由协议形成此路由时的开销 -- 不同的协议计算开销值的方式有区别(越小越优) ...
- Myeclipse+svn相关文章
Myeclipse安装svn插件https://www.cnblogs.com/liuyk-code/p/7519886.html 使用svn https://jingyan.baidu.com/ar ...
- 机器学习实战:用SVD压缩图像
前文我们了解了奇异值分解(SVD)的原理,今天就实战一下,用矩阵的奇异值分解对图片进行压缩. Learn by doing 我做了一个在线的图像压缩应用,大家可以感受一下. https://huggi ...