严格验证身份证号码需要同时验证号码的格式和有效性,以及身份证号码对应的地区、出生日期和校验码是否正确。以下是一个严格验证身份证号码的示例代码:
```php
function validate_id_card($id_card) {
// 身份证号码格式验证
if (!preg_match('/^\d{17}(\d|x)$/i', $id_card)) {
return false;
}
// 身份证号码校验
$id_card = strtoupper($id_card);
$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$sigma = 0;
for ($i = 0; $i < 17; $i++) {
$sigma += ($id_card[$i] * $wi[$i]);
}
$index = $sigma % 11;
if ($id_card[17] != $ai[$index]) {
return false;
}
// 身份证号码地区验证
$area_code = substr($id_card, 0, 2);
$area_codes = 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',
);
if (!in_array($area_code, $area_codes)) {
return false;
}
// 身份证号码出生日期验证
$birth_date_str = substr($id_card, 6, 8);
$birth_date = DateTime::createFromFormat('Ymd', $birth_date_str);
if (!$birth_date) {
return false;
}
$current_date = new DateTime();
if ($birth_date > $current_date) {
return false;
}
// 身份证号码校验码验证
$check_code = substr($id_card, 17, 1);
$check_codes = array(
'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2',
);
$check_sum = 0;
for ($i = 0; $i < 17; $i++) {
$check_sum += ($id_card[$i] * $wi[$i]);
}
$check_index = $check_sum % 11;
if ($check_code != $check_codes[$check_index]) {
return false;
}
return true;
}
```
你可以使用该函数来严格验证身份证号码是否合法。例如:
```php
if (validate_id_card('110101198001011234')) {
echo '合法的身份证号码';
} else {
echo '不合法的身份证号码';
}
```
注意,该函数中使用了 PHP 的 DateTime 类来处理身份证号码中的出生日期,因此需要 PHP 版本为 5.2.0 或更高。如果你使用的是较低版本的 PHP,你需要使用其他方式来处理身份证号码中的日期信息。