前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP中一些常用证件的验证方法

PHP中一些常用证件的验证方法

作者头像
用户7657330
发布2020-08-14 15:24:47
4140
发布2020-08-14 15:24:47
举报
文章被收录于专栏:程序生涯
代码语言:javascript
复制
<?php

/**
 * 来往港澳通行证:
 * 1.W,C+8位数字
 * 2.7位数字
 */
function gapassport_verify($content)
{
    $pattern = "/^\d{7}$|^[W|C]\d{8}$/";
    if (!preg_match($pattern, $content)) {
        return false;
    }
    return true;
}

/**
 * 身份证校验代码
 */
function idCardVerify($id_card)
{
    if (strlen($id_card) == 18) {
        return idcard_checksum18($id_card);
    } elseif ((strlen($id_card) == 15)) {
        $id_card = idcard_15to18($id_card);
        return idcard_checksum18($id_card);
    } else {
        return false;
    }
}

// 计算身份证校验码,根据国家标准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;
    }
    $aCity = 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 (!array_key_exists(substr($idcard, 0, 2), $aCity)) {
        return false;
    }
    //验证生日
    if (!checkdate(substr($idcard, 10, 2), substr($idcard, 12, 2), substr($idcard, 6, 4))) {
        return false;
    }
    $idcard_base = substr($idcard, 0, 17);
    if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))) {
        return false;
    } else {
        return true;
    }
}


/**
 * 国内护照
 * 1.G|E+8位数字:如:G12345678
 * 2.D|S|P+7位数字:如:D1234567
 */
function passportVerify($content)
{
    $pattern = "/^[\w]{5,17}$/";
    return preg_match($pattern, $content);
}


/**
 * 台胞证:
 * 1、8位数字,如:12345678
 * 2、10位数字+(1位英文字母),如:1234567890(T)
 */
function taibaoVerify($content)
{
    $pattern_one = "/^[\d]{8}$/";
    $pattern_two = "/^[\d]{10}[(|(][a-zA-z][)|)]$/iu";
    return (preg_match($pattern_one, $content) || preg_match($pattern_two, $content));
}

/**
 * 赴台证:
 * 1.T+8位数字
 * 2.25+7位数字
 */
function twpassport_verify($content)
{
    $pattern = "/^25\d{7}$|^T\d{8}$/";
    if (!preg_match($pattern, $content)) {
        return false;
    }
    return true;
}


/**
 * 军官证
 * X字+8位,如:南字12345678
 */
function junguanVerify($content)
{
    if (mb_strlen($content) != 10) {
        return false;
    }
    $check = preg_match("/^[\x{4e00}-\x{9fa5}]{1}\x{5b57}$/u", mb_substr($content, 0, 2));
    if ($check && preg_match("/^\d{8}$/u", mb_substr($content, 2, 8))) {
        return true;
    }
    return false;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档