写了几个身份证方面的函数, 个人感觉挺有用的, 特别是在网络问卷调查时, 对个人信息里的身份证进行验证很有用, 但是应者寥寥, 还是收在自己的 blog 里算了
代码如下:
- // 计算身份证校验码, 根据国家标准 GB 11643-1999
- function idcard_verify_number($idcard_base) {
- if (strlen($idcard_base) != 17) {
- return false;
- }
- // 加权因子
- $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
- // 校验码对应值
- $verify_number_list = array('1, 0, X', 9, 8, 7, 6, 5, 4, 3, 2);
- $checksum = 0;
- for ($i = 0; $i < strlen($idcard_base); $i++) {
- $checksum += substr($idcard_base, $i, 1) * $factor[$i];
- }
- $mod = $checksum % 11;
- $verify_number = $verify_number_list[$mod];
- return $verify_number;
- }
- // 将 15 位身份证升级到 18 位
- function idcard_15to18($idcard) {
- if (strlen($idcard) != 15) {
- return false;
- } else {
- // 如果身份证顺序码是 996 997 998 999, 这些是为百岁以上老人的特殊编码
- if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false) {
- $idcard = substr($idcard, 0, 6).'18'.substr($idcard, 6, 9);
- } else {
- $idcard = substr($idcard, 0, 6).'19'.substr($idcard, 6, 9);
- }
- }
- $idcard = $idcard.idcard_verify_number($idcard);
- return $idcard;
- }
- // 18 位身份证校验码有效性检查
- function idcard_checksum18($idcard) {
- if (strlen($idcard) != 18) {
- return false;
- }
- $idcard_base = substr($idcard, 0, 17);
- if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))) {
- return false;
- } else {
- return true;
- }
- } ? >
其中的 $idcard_base 是指身份证中的本位码, 本位码是 18 位身份证里才有的, 也就是 18 位身份证的前 17 位, 最后一位称为校验码
一般在使用的时候不用直接调用 idcard_verify_number(), 平时的应用大多是使用后两个函数
这些函数都没有关心身份证字符串的格式问题, 在调用前自行进行格式检查
来源: https://www.php1.cn/detail/php-509bb106b8.html