身份证号验证(兼容15,18位)_PHP教程
程序员文章站
2022-05-21 10:25:47
...
份证号验证(兼容15,18位) ,注册验证的时候可以用上。
代码片段(1)
[代码] [PHP]代码
view source print?01
//比较菜鸟 第一次分享代码
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
$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
}
上一篇: PHP腾讯与百度坐标转换