php验证身份证号码是否正确函数
发布:smiling 来源: PHP粉丝网 添加日期:2016-07-15 16:13:08 浏览: 评论:0
身份证验证最简单的就是判断长度了,当然这种非常简单破了如果要更规则一点我们需要对身份证号码进行一些按生成规则验证了,下面整理了一些函数我们来看看。
例子,今天分享一个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('身份证号码');
Tags: 函数 身份证 号码
- 上一篇:php版本的支付宝服务窗API接口的开发
- 下一篇:php 设计模式之单例模式例子
相关文章
- ·php header()函数设置页面Cache缓存(2014-01-06)
- ·php json_encode()函数中文编码乱码解决方法(2014-01-16)
- ·php中pcntl_alarm为函数设置超时限制(2014-02-11)
- ·php利用CURL函数登入163邮箱并获取自己的通讯录(2014-06-17)
- ·php实现a到z及其中的”奇怪现象”(2014-06-21)
- ·php自定义加密函数、解密的例子(2014-06-28)
- ·关闭php执行系统指令函数(2014-08-22)
- ·php防止sql注入实现方法(2014-08-23)
- ·利用php.ini禁用一些危险php函数(2014-08-23)
- ·php 最简单sql防注入函数与方法(2014-08-23)
- ·php中Curl函数常用的两个例子,登陆/soap(2014-08-27)
- ·分享淘宝API辅助函数-适用CI框架(2014-08-27)
- ·php Header函数实现下载短点续传程序(2014-08-28)
- ·PHP中校验ISBN码的函数详解(2014-08-28)
- ·php fputcsv() 函数csv数据读写数据库文件代码(2014-09-08)
- ·PHP不支持socket_connect函数开启步骤(2014-09-10)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)