PHP 验证身份证号

PHP 验证身份证号

只适用二代身份证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 验证身份证号
* https://gist.github.com/lmh3/331d225f4f63eed7e6152a35ab625906
*
* @param string|int $code 身份证号码
* @return bool
*/
function validator_idcard($code) : bool {
$code = strval($code);

if(strlen($code) !== 18 || !preg_match('/^\d+$/i', substr($code, 0, -1))) {
return false;
}

$year = intval(substr($code, 6, 4));
$month = intval(substr($code, 10, 2));
$day = intval(substr($code, 12, 2));

if(!checkdate($month, $day, $year)) {
return false;
}

$weight = [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 += $code[$i] * $weight[$i];
}

$checkBits = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

if ($checkBits[$sum % 11] !== $code[17]) {
return false;
}

return true;
}

蹭热度,这边我们做个小实践,找出符合的身份证号码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for($i = 0; $i < 9999; $i++) {
// 前置补 0
$num = sprintf('%04d', $i);

// 正则过滤
if(!preg_match('/^[02]{4}$/', $num)) {
continue;
}

// 补齐身份证号码
$idcard = '22020220200202' . $num;

if(validator_idcard($idcard)) {
// 验证通过
echo $idcard . PHP_EOL;
}
}
1
2
3
$ php index.php
220202202002020022
220202202002022220

经过测试发现只有两个身份号码,不过最后一个的最后一位是 0 ,在我们身份证中最后一位如果为 0 应该用 X 代替。

期待 220202202002020022 这位小朋友的诞生。

往上