php验证身份证号码正确性的函数


Posted in PHP onJuly 20, 2016

身份证验证最简单的就是判断长度了,当然这种非常简单破了如果要更规则一点我们需要对身份证号码进行一些按生成规则验证了,下面整理了一些函数我们来看看。

例子,今天分享一个php验证身份证号码是否正确函数.

/********************php验证身份证号码是否正确函数*********************/ 
function is_idcard( $id ) 
{ 
  $id = strtoupper($id); 
  $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/"; 
  $arr_split = array(); 
  if(!preg_match($regx, $id)) 
  { 
    return FALSE; 
  } 
  if(15==strlen($id)) //检查15位 
  { 
    $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/"; 
 
    @preg_match($regx, $id, $arr_split); 
    //检查生日日期是否正确 
    $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 
    if(!strtotime($dtm_birth)) 
    { 
      return FALSE; 
    } else { 
      return TRUE; 
    } 
  } 
  else      //检查18位 
  { 
    $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/"; 
    @preg_match($regx, $id, $arr_split); 
    $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 
    if(!strtotime($dtm_birth)) //检查生日日期是否正确 
    { 
      return FALSE; 
    } 
    else 
    { 
      //检验18位身份证的校验码是否正确。 
      //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 
      $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); 
      $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); 
      $sign = 0; 
      for ( $i = 0; $i < 17; $i++ ) 
      { 
        $b = (int) $id{$i}; 
        $w = $arr_int[$i]; 
        $sign += $b * $w; 
      } 
      $n = $sign % 11; 
      $val_num = $arr_ch[$n]; 
      if ($val_num != substr($id,17, 1)) 
      { 
        return FALSE; 
      } //phpfensi.com 
      else 
      { 
        return TRUE; 
      } 
    } 
  } 
 
}

调用身份证验证函数
 $idc=is_idcard("身份证号码");
if($idc){echo "正确";}else{echo "错误";}

例子二:

function validation_filter_id_card($id_card){ 
 if(strlen($id_card)==18){ 
 return idcard_checksum18($id_card); 
 }elseif((strlen($id_card)==15)){ 
 $id_card=idcard_15to18($id_card); 
 return idcard_checksum18($id_card); 
 }else{ 
 return false; 
 } 
} 
// 计算身份证校验码,根据国家标准GB 11643-1999 
function idcard_verify_number($idcard_base){ 
 if(strlen($idcard_base)!=17){ 
 return false; 
 } 
 //加权因子 
 $factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); 
 //校验码对应值 
 $verify_number_list=array('1','0','X','9','8','7','6','5','4','3','2'); 
 $checksum=0; 
 for($i=0;$i<strlen($idcard_base);$i++){ 
 $checksum += substr($idcard_base,$i,1) * $factor[$i]; 
 } 
 $mod=$checksum % 11; 
 $verify_number=$verify_number_list[$mod]; 
 return $verify_number; 
} 
// 将15位身份证升级到18位 
function idcard_15to18($idcard){ 
 if(strlen($idcard)!=15){ 
 return false; 
 }else{ 
 // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 
 if(array_search(substr($idcard,12,3),array('996','997','998','999')) !== false){ 
  $idcard=substr($idcard,0,6).'18'.substr($idcard,6,9); 
 }else{ 
  $idcard=substr($idcard,0,6).'19'.substr($idcard,6,9); 
 } 
 } 
 $idcard=$idcard.idcard_verify_number($idcard); 
 return $idcard; 
} 
// 18位身份证校验码有效性检查 
function idcard_checksum18($idcard){ 
 if(strlen($idcard)!=18){ 
 return false; 
 } 
 $idcard_base=substr($idcard,0,17); 
 if(idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){ 
 return false; 
 }else{ 
 return true; 
 } 
}

调用方法如:validation_filter_id_card('身份证号码');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 PHP
PHP加密解密类实例代码
Jul 20 #PHP
php图片添加水印例子
Jul 20 #PHP
支付宝服务窗API接口开发php版本
Jul 20 #PHP
PHP二维数组矩形转置实例
Jul 20 #PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 #PHP
PHP的AES加密算法完整实例
Jul 20 #PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 #PHP
You might like
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
python+django加载静态网页模板解析
2017/12/12 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
pymysql 开启调试模式的实现
2019/09/24 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
详解Python中的文件操作
2021/01/14 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
房屋公证委托书
2014/04/03 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
委托书的写法
2014/08/30 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
学籍证明模板
2015/06/18 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL