《維易PHP高級身份證號驗證類》要點:
本文介紹了維易PHP高級身份證號驗證類,希望對您有用。如果有疑問,可以聯系我們。
這個維易PHP身份證號驗證類對身份證進行了更嚴格的驗證。但還不是最強的,最強的就是有一些網站,如阿里云API,通過調用API身份證接口,可以查到公安系統是否登記過。以及身份證號和姓名是否一致。
不過,普通使用場合,這個php類就夠用了。
比如現在很多微商分銷授權登記,需要身份證號,一般都是真實的,但也不需要金融級別那么嚴格,這時就需要強化驗證一下就行了,本類就可以派上用場。
另外,如果需要前端javascript身份證驗證類,查看這里:http://www.snjht.com/jiaocheng/6.html
header("content-type:text/html;charset=utf-8"); $num = '350322199001282536'; $sex = 1; // 1為男,2為女,不輸入為不驗證 $test = new check(); $data = $test ->checkIdentity($num,$sex); //$sex是否男性或女性 //$data = $test ->checkIdentity($num); var_dump($data);
<?php /** * 維易身份證驗證 * Class idCardCheck * http://www.snjht.com 維易PHP培訓 */ class idCardCheck { /** * $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位身份證最后一位:$end最后一位,$num身份證號 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(strtolower($checkHou[$checkHouParameter] )!= strtolower($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; } } }
新的18位身份證號碼各位的含義:
1-2位省、自治區、直轄市代碼; 11-65
3-4位地級市、盟、自治州代碼;
5-6位縣、縣級市、區代碼;
7-14位出生年月日,比如19670401代表1967年4月1日;
15-17位為順序號,其中17位男為單數,女為雙數;
18位為校驗碼,0-9和X,由公式隨機產生。
舉例:
130503 19670401 0012這個身份證號的含義: 13為河北,05為邢臺,03為橋西區,出生日期為1967年4月1日,順序號為001,2為驗證碼。
15位身份證號碼各位的含義:
1-2位省、自治區、直轄市代碼;
3-4位地級市、盟、自治州代碼;
5-6位縣、縣級市、區代碼;
7-12位出生年月日,比如670401代表1967年4月1日,這是和18位號碼的第一個區別;
13-15位為順序號,其中15位男為單數,女為雙數;
與18位身份證號的第二個區別:沒有最后一位的驗證碼。
舉例:
130503 670401 001的含義; 13為河北,05為邢臺,03為橋西區,出生日期為1967年4月1日,順序號為001。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/43.html