PHP身份证号校验类:支持15位到18位转换与验证

0 下载量 62 浏览量 更新于2024-08-31 收藏 78KB PDF 举报
"这篇文章主要介绍了一个PHP类,用于校验15位和18位的身份证号码。作者在新公司的框架源码中发现这个需求,因此进行了搜索和封装。身份证号码分为15位和18位,18位身份证号包含校验码,15位则没有。18位身份证号的校验码可以通过特定算法计算得出,该算法涉及到对身份证号码前17位数字的特定权重求和,并对11取模。15位身份证号通常通过加上19年份转换成18位。身份证号的校验包括验证省份、地级市、县级市、出生日期以及校验码的正确性。虽然可以通过算法校验,但最准确的方式是通过官方接口进行验证。" 在PHP中,身份证号码的校验是基于一定的规则进行的。对于15位身份证号码,结构为省份(2位)+地级市(2位)+县级市(2位)+出生年(2位)+出生月(2位)+出生日(2位)+顺序号(3位)。而18位身份证号码在15位的基础上增加了出生年的2位和一个校验位。顺序号的奇偶性可以区分性别,奇数代表男性,偶数代表女性。 校验18位身份证号的校验位时,需要将前17位数字分别与特定权重(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)相乘,累加后对11取模,根据模的结果在特定字符集('1','0','X','9','8','7','6','5','4','3','2')中找到对应的字符作为校验位。 15位身份证号码转为18位,通常只需在出生年份前加上19,然后计算校验位并添加到末尾。 在实现身份证校验的PHP类时,可以包括以下几个功能: 1. 检查身份证号码的长度是否正确,即15位或18位。 2. 验证省份代码的有效性,虽然省份数量有限,但可能需要相关数据支持。 3. 检查地级市和县级市的代码,这需要具体地区的行政编码数据库。 4. 校验出生日期的合理性,确保日期符合实际的日历日期。 5. 计算并校验18位身份证的校验码。 6. 对于15位身份证,提供转换为18位的功能,但推荐使用18位的身份证号码进行校验。 以下是一个简化的PHP身份证校验类的示例: ```php class IDCardFilter { public function validate($idCard) { // 验证长度 if (strlen($idCard) != 15 && strlen($idCard) != 18) { return false; } // 15位转18位 if (strlen($idCard) == 15) { $idCard = substr($idCard, 0, 6) . '19' . substr($idCard, 6); } // 校验18位 $weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; $checkChars = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; $sum = 0; for ($i = 0; $i < 17; $i++) { $sum += intval($idCard[$i]) * $weights[$i]; } $mod = $sum % 11; if ($checkChars[$mod] != strtoupper($idCard[17])) { return false; } // 其他验证(如日期、地区代码等) // ... return true; } } ``` 这个简单的示例类包含了基本的身份证号长度验证和15转18位以及18位校验位的验证。对于更全面的验证,需要额外添加检查日期和行政区划代码的逻辑。此外,如果可能,应优先使用权威部门提供的接口进行身份证号码的校验,以提高准确性。