• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP验证身份证格式

php 搞代码 4年前 (2022-01-21) 32次浏览 已收录 0个评论

互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的。几乎都是在网上买一些大的互联网公司的一些认证服务。即使是便宜一些的认证价格也达到了10万次/万元。也就是一角钱一次了,还是挺贵哈。所以为了减少公司的开支,我们在拿到用户提交的身份证信息去认证前应该自己先检验一下身份证的格式,如果连最基本的身份证格式就不满足的话,我们完全可以直接驳回,不必走接下来的花钱认证流程了,而且也可以建立一个用户身份证表,把每次认证通过的数据存起来,以后每次都先从自己系统里的用户身份证表查询,查不到再去走认证流程,最大化节省公司开支。
这里提供一个初步验证身份证格式的PHP身份证验证类。该类只提供一个静态方法isValid接口,使用起来也很简单,只需要使用IdentityCard::isValid即可验证。可以放到自己项目中当做工具类。该方法可以同时验证15位的老身份证和18位的新身份证格式
PHP版本: >=7.0.0
注: 如果PHP版本低于7.0版本只需要把类中方法的参数限制取消掉即可使用。

class IdentityCard{    /**     * 校验身份证号是否合法     * @param string $num 待校验的身份证号     * @return bool     */    public static function isValid(string $num)    {        //老身份证长度15位,新身份证长度18位        $length = strlen($num);        if ($length == 15) { //如果是15位身份证            //15位身份证没有字母            if (!is_numeric($num)) {                return false;            }            // 省市县(6位)            $areaNum = substr($num, 0, 6);            // 出生年月(6位)            $dateNum = substr($num, 6, 6);        } else if ($length == 18) { //如果是18位身份证            //基本格式校验            if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {                return false;            }            // 省市县(6位)            $areaNum = substr($num, 0, 6);            // 出生年月日(8位)            $dateNum = substr($num, 6, 8);        } else { //假身份证            return false;        }        //验证地区        if (!self::isAreaCodeValid($areaNum)) {            return false;        }        //验证日期        if (!self::isDateValid($dateNum)) {            return false;        }        //验证最后一位        if (!self::isVerifyCodeValid($num)) {            return false;        }        return true;    }    /**     * 省市自治区校验     * @param string $area 省、直辖市代码     * @return bool     */    private static function isAreaCodeValid(string $area) {        $provinceCode = substr($area, 0, 2);        // 根据GB/T2260—999,省市代码11到65        if (11 <= $provinceCode && $provinceCode <= 65) {            return true;        } else {            return false;        }    }    /**     * 验证出生日期合法性     * @param string $date 日期     * @return bool     */    private static function isDateValid(string $date) {        if (strlen($date) == 6) { //15位身份证号没有年份,这里拼上年份            $date = '19'.$date;        }        $year  = intval(substr($date, 0, 4));        $month = intval(substr($date, 4, 2));        $day   = intval(substr($date, 6, 2));        //日期基本格式校验        if (!checkdate($month, $day, $year)) {            return false;        }        //日期格式正确,但是逻辑存在问题(如:年份大于当前年)        $currYear = date('Y');        if ($year > $currYear) {            return false;        }        return true;    }    /**     * 验证18位身份证最后一位     * @param string $num 待校验的身份证号     * @return bool     */    private static function isVerifyCodeValid(string $num)    {        if (strlen($num) == 18) {            $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];            $tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];            $checkSum = 0;            for ($i = 0; $i < 17; $i++) {                $checkSum += intval($num{$i}) * $factor[$i];            }            $mod   = $checkSum % 11;            $token = $tokens[$mod];            $lastChar = strtoupper($num{17});            if ($lastChar != $token) {                return fals<b>/本文来源gao@!dai!ma.com搞$$代^@码5网@</b><strong>搞代gaodaima码</strong>e;            }        }        return true;    }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP验证身份证格式
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址