旧香港身份证校验

背景:前一阵子遇到了【旧】香港的身份证校验的问题,分享出来,希望能帮助需要的人

一、校验身份证

IdVerify::verifyHKIdCard($number)

二、检验身份证算法

namespace App\Services;
class IdVerify
{
    //香港身份证首字母对应的数字
    private static $capitalNum = array(
        'A'=>10,
        'B'=>11,
        'C'=>12,
        'D'=>13,
        'E'=>14,
        'F'=>15,
        'G'=>16,
        'H'=>17,
        'I'=>18,
        'J'=>19,
        'K'=>20,
        'L'=>21,
        'M'=>22,
        'N'=>23,
        'O'=>24,
        'P'=>25,
        'Q'=>26,
        'R'=>27,
        'S'=>28,
        'T'=>29,
        'U'=>30,
        'V'=>31,
        'W'=>32,
        'X'=>33,
        'Y'=>34,
        'Z'=>35,
        ' '=>36,
    );

    /**
     *  香港身份证验证
     * @param $number
     * @return bool
     */
  public static function verifyHKIdCard($number)
    {
        //将中文括号全部替换成英文括号
        if (strpos($number, "(") || strpos($number, ")")) {
            $number = str_replace('(', '(', $number);
            $number = str_replace(')', ')', $number);
        }

        $number_num = strlen($number);

        if (!in_array($number_num, array(10, 11))) {
            return false;
        }

        $first_num = substr($number, 0, 1);//取首字母
        $number_num == 10 && $number = ' ' . $number;
        $checkCode = substr($number, -2, 1);//取括号内的校验码

        if ((!preg_match('/^[A-Z]+$/', $first_num)) || !is_numeric(substr($number, 2, 6))) {
            return false;
        }

        $number_ex = explode('(', $number);
        $number_arr = str_split($number_ex[0]);

        $number_sum = 0;
        $i = 9;
        foreach ($number_arr as $k => $v) {
            if (isset(static::$capitalNum[$v]) || is_numeric($v)) {
                if (isset(static::$capitalNum[$v])) {
                    $number_total = (static::$capitalNum[$v] % 11) * $i % 11;
                } else {
                    $number_total = $v * $i % 11;
                }

                $i -= 1;
                $number_sum += $number_total;
            }

        }
        $result = $number_sum % 11;

        switch ($result) {
            case 1:
                $result = 'A';
                break;
            case 0:
                $result = 0;
                break;
            default:
                $result = 11 - $result;
                break;
        }

        if ($checkCode == $result) {
            return true;
        } else {
            return false;
        }
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
萧风
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!