身份证号验证(兼容15,18位)
//比较菜鸟 第一次分享代码
02 |
//身份证号验证 |
03 |
protected function checkIdCard(){ |
04 |
if ( empty ( $_POST [ 'idcard' ])){ |
05 |
return false; |
06 |
} |
07 |
$idcard = $_POST [ 'idcard' ]; |
08 |
$City = array (11=> "北京" ,12=> "天津" ,13=> "河北" ,14=> "山西" ,15=> "内蒙古" ,21=> "辽宁" ,22=> "吉林" ,23=> "黑龙江" ,31=> "上海" ,32=> "江苏" ,33=> "浙江" ,34=> "安徽" ,35=> "福建" ,36=> "江西" ,37=> "山东" ,41=> "河南" ,42=> "湖北" ,43=> "湖南" ,44=> "广东" ,45=> "广西" ,46=> "海南" ,50=> "重庆" ,51=> "四川" ,52=> "贵州" ,53=> "云南" ,54=> "西藏" ,61=> "陕西" ,62=> "甘肃" ,63=> "青海" ,64=> "宁夏" ,65=> "新疆" ,71=> "台湾" ,81=> "香港" ,82=> "澳门" ,91=> "国外" ); |
09 |
$iSum = 0; |
10 |
$idCardLength = strlen ( $idcard ); |
11 |
//长度验证 |
12 |
if (!preg_match( '/^\d{17}(\d|x)$/i' , $idcard ) and !preg_match( '/^\d{15}$/i' , $idcard )) |
13 |
{ |
14 |
return false; |
15 |
} |
16 |
//地区验证 |
17 |
if (! array_key_exists ( intval ( substr ( $idcard ,0,2)), $City )) |
18 |
{ |
19 |
return false; |
20 |
} |
21 |
// 15位身份证验证生日,转换为18位 |
22 |
if ( $idCardLength == 15) |
23 |
{ |
24 |
$sBirthday = '19' . substr ( $idcard ,6,2). '-' . substr ( $idcard ,8,2). '-' . substr ( $idcard ,10,2); |
25 |
$d = new DateTime( $sBirthday ); |
26 |
$dd = $d ->format( 'Y-m-d' ); |
27 |
if ( $sBirthday != $dd ) |
28 |
{ |
29 |
return false; |
30 |
} |
31 |
$idcard = substr ( $idcard ,0,6). "19" . substr ( $idcard ,6,9); //15to18 |
32 |
$Bit18 = getVerifyBit( $idcard ); //算出第18位校验码 |
33 |
$idcard = $idcard . $Bit18 ; |
34 |
} |
35 |
// 判断是否大于2078年,小于1900年 |
36 |
$year = substr ( $idcard ,6,4); |
37 |
if ( $year <1900 || $year >2078 ) |
38 |
{ |
39 |
return false; |
40 |
} |
41 |
42 |
//18位身份证处理 |
43 |
$sBirthday = substr ( $idcard ,6,4). '-' . substr ( $idcard ,10,2). '-' . substr ( $idcard ,12,2); |
44 |
$d = new DateTime( $sBirthday ); |
45 |
$dd = $d ->format( 'Y-m-d' ); |
46 |
if ( $sBirthday != $dd ) |
47 |
{ |
48 |
return false; |
49 |
} |
50 |
//身份证编码规范验证 |
51 |
$idcard_base = substr ( $idcard ,0,17); |
52 |
if ( strtoupper ( substr ( $idcard ,17,1)) != getVerifyBit( $idcard_base )) |
53 |
{ |
54 |
return false; |
55 |
} |
56 |
return $_POST [ 'idcard' ]; |
57 |
} |
58 |
59 |
// 计算身份证校验码,根据国家标准GB 11643-1999 |
60 |
function getVerifyBit( $idcard_base ) |
61 |
{ |
62 |
if ( strlen ( $idcard_base ) != 17) |
63 |
{ |
64 |
return false; |
65 |
} |
66 |
//加权因子 |
67 |
$factor = array (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); |
68 |
//校验码对应值 |
69 |
$verify_number_list = array ( '1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2' ); |
70 |
$checksum = 0; |
71 |
for ( $i = 0; $i < strlen ( $idcard_base ); $i ++) |
72 |
{ |
73 |
$checksum += substr ( $idcard_base , $i , 1) * $factor [ $i ]; |
74 |
} |
75 |
$mod = $checksum % 11; |
76 |
$verify_number = $verify_number_list [ $mod ]; |
77 |
return $verify_number ; |
78 |
} |