php正则判断是否为合法身份证号的方法

要使用正则表达式判断一个字符串是否为合法身份证号,可以按照以下步骤进行操作。

1. 编写正则表达式

首先,我们需要编写一个正则表达式,用于匹配符合身份证号格式的字符串。根据国家标准GB 11643-1999的规定,身份证号的格式如下:

  • 18位身份证号:由17位数字码和1位校验码组成。其中,前6位为地址码,接下来8位为出生日期码,最后3位为顺序码和校验码。
  • 15位身份证号:由6位地址码、6位出身日期码和3位顺序码组成。

因此,我们可以编写以下两个正则表达式进行匹配:

// 18位身份证号的正则表达式
$pattern_18 = '/^\d{6}(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/';
// 15位身份证号的正则表达式
$pattern_15 = '/^\d{6}\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}$/';

2. 使用preg_match函数进行匹配

接下来,我们可以使用PHP的preg_match函数来判断一个字符串是否匹配上述正则表达式。示例如下:

// 判断一个字符串是否为18位身份证号
$id = '330302198712110065';
if (preg_match($pattern_18, $id)) {
    echo '是一个18位身份证号';
} else {
    echo '不是一个18位身份证号';
}

// 判断一个字符串是否为15位身份证号
$id = '330302871211006';
if (preg_match($pattern_15, $id)) {
    echo '是一个15位身份证号';
} else {
    echo '不是一个15位身份证号';
}

3. 校验身份证号的有效性

虽然一个字符串能够匹配上身份证号的正则表达式,但并不意味着这个字符串就是一个合法的身份证号。还需要进行身份证号的有效性校验。这个过程比较繁琐,需要涉及到身份证号最后一位的校验码计算、生日日期的格式校验、以及地址码的校验等等。

以下是一个使用PHP编写的校验身份证号有效性的函数示例:

/**
 * 判断一个字符串是否为合法身份证号
 * @param string $id 身份证号
 * @return bool
 */
function is_valid_id($id) {
    // 18位身份证号的正则表达式
    $pattern_18 = '/^\d{6}(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$/';
    // 15位身份证号的正则表达式
    $pattern_15 = '/^\d{6}\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}$/';

    // 先判断身份证号是否符合一个有效的格式
    if (!preg_match($pattern_18, $id) && !preg_match($pattern_15, $id)) {
        return false;
    }

    // 校验地址码
    $address_code = substr($id, 0, 6);
    if (!is_valid_address_code($address_code)) {
        return false;
    }

    // 校验生日
    $birthday = get_birthday_from_id($id);
    if (!$birthday || !is_valid_birthday($birthday)) {
        return false;
    }

    // 18位身份证号需要校验校验码
    if (strlen($id) == 18 && !is_valid_check_code($id)) {
        return false;
    }

    // 所有校验都通过,说明这个字符串是一个有效的身份证号
    return true;
}

/**
 * 从身份证号中提取出生日
 * @param string $id 身份证号
 * @return string|bool 返回生日的字符串格式(Y-m-d),如果提取失败则返回false
 */
function get_birthday_from_id($id) {
    $len = strlen($id);
    if ($len == 15) {
        return '19' . substr($id, 6, 2) . '-' . substr($id, 8, 2) . '-' . substr($id, 10, 2);
    } elseif ($len == 18) {
        return substr($id, 6, 4) . '-' . substr($id, 10, 2) . '-' . substr($id, 12, 2);
    } else {
        return false;
    }
}

/**
 * 校验地址码
 * @param string $code 地址码
 * @return bool
 */
function is_valid_address_code($code) {
    // 根据现行行政区划地名与代码对照表,最多只能到第六级行政区划
    $valid_codes = array(
        '110000', '110100', '110101', '110102', '110105', // 北京
        '120000', '120100', '120101', '120102', '120103', // 天津
        '130000', '130100', '130102', '130103', '130104', // 河北省
        // ... 中间省略 ...
        '820100', '820200', // 澳门
        '710000', '710100', '710101', '710102', '710103' // 台湾
    );
    return in_array($code, $valid_codes);
}

/**
 * 校验生日的格式
 * @param string $birthday 生日字符串(Y-m-d)
 * @return bool
 */
function is_valid_birthday($birthday) {
    return preg_match('/^\d{4}-\d{2}-\d{2}$/', $birthday) && strtotime($birthday) !== false;
}

/**
 * 校验身份证号的校验码
 * @param string $id 身份证号
 * @return bool
 */
function is_valid_check_code($id) {
    $check_codes = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
    $weights = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    $sum = 0;
    $len = strlen($id);
    for ($i = 0; $i < $len - 1; $i++) {
        $sum += $weights[$i] * intval($id[$i]);
    }
    $mod = $sum % 11;
    return $id[$len - 1] == $check_codes[$mod];
}

示例说明

以下是一个示例说明,说明身份证号的匹配和有效性校验的过程。

// 身份证号的格式正确,但是地址码错误,不是一个合法的身份证号
$id = '999999198712110065';
if (preg_match($pattern_18, $id) || preg_match($pattern_15, $id)) {
    if (is_valid_id($id)) {
        echo '是一个合法的身份证号';
    } else {
        echo '不是一个合法的身份证号';
    }
} else {
    echo '不符合身份证号的格式规定';
}

// 身份证号的格式正确,并经过有效性校验,是一个合法的身份证号
$id = '330302198712110065';
if (preg_match($pattern_18, $id) || preg_match($pattern_15, $id)) {
    if (is_valid_id($id)) {
        echo '是一个合法的身份证号';
    } else {
        echo '不是一个合法的身份证号';
    }
} else {
    echo '不符合身份证号的格式规定';
}

输出结果分别为:

不是一个合法的身份证号
是一个合法的身份证号

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php正则判断是否为合法身份证号的方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • PHP判断字符串长度的两种方法很实用

    当我们使用PHP编写代码时,经常需要判断字符串的长度。本文将为大家介绍两种实用的PHP判断字符串长度的方法。 方法一:strlen()函数 strlen()函数用于计算一个字符串的长度,返回的是该字符串的字符数。使用该函数,我们可以方便地判断字符串的长度。 <?php $str1 = "Hello, world!"; $str2 =…

    PHP 2023年5月26日
    00
  • 用PHP写的MySQL数据库用户认证系统代码

    下面我将为您详细讲解“用PHP写的MySQL数据库用户认证系统代码”的完整攻略。 步骤一:创建MySQL数据库和表格 首先,需要在MySQL中创建一个用于存储用户数据的数据库和表格。可以使用如下SQL代码: CREATE DATABASE `user_authentication`; USE `user_authentication`; CREATE TAB…

    PHP 2023年5月24日
    00
  • php构造函数实例讲解

    PHP构造函数实例讲解 构造函数是一种特殊的类方法,它主要用于在对象被实例化时初始化对象的属性和方法。在本文中,我们将探讨 PHP 中的构造函数,并提供一些示例。 构造函数的基本语法 PHP 的构造函数与其他编程语言的构造函数类似,可以使用 __construct() 方法来定义。 示例代码 class Person { public $name; func…

    PHP 2023年5月27日
    00
  • iOS+PHP注册登录系统 PHP部分(上)

    我为你详细讲解“iOS+PHP注册登录系统 PHP部分(上)”的完整攻略。 简介 该攻略主要讲解了如何使用PHP搭建一个iOS注册登录系统,共分为上下两部分,本文主要介绍上部分的内容。上部分主要讲解的是如何使用PHP完成前后端交互和用户注册的功能。 环境准备 使用PHP搭建一个iOS注册登录系统,需要准备以下环境和工具: PHP,建议使用PHP 5.4及以上…

    PHP 2023年5月30日
    00
  • php实现将数组转换为XML的方法

    下面是PHP实现将数组转换为XML的方法的详细攻略: 1.使用SimpleXMLElement SimpleXMLElement是PHP内置的一个类,可以非常方便地将数组转换为XML格式。 以下是一个示例代码: $data = array( ‘name’ => ‘John’, ‘age’ => 30, ’email’ => ‘john@ex…

    PHP 2023年5月26日
    00
  • php版银联支付接口开发简明教程

    下面是关于“php版银联支付接口开发简明教程”的完整攻略。 一、前置知识 在开始使用银联支付接口进行开发之前,需要掌握以下知识: PHP基础知识 网络编程基础知识 HTTP协议基础知识 rsa加密算法基础知识 二、准备工作 在进行银联支付接口开发之前,需要进行以下准备工作: 申请商户号和商户秘钥 下载工具包并解压 了解银联支付接口开发文档 三、接口集成 引入…

    PHP 2023年5月26日
    00
  • PHP使用PHPExcel删除Excel单元格指定列的方法

    下面是关于使用PHPExcel删除Excel单元格指定列的方法的详细攻略。 需要准备的几个工具 在使用PHPExcel删除Excel单元格指定列的方法之前,需要先准备好以下几个工具: PHPExcel:PHPExcel是PHP操作Excel的一个开源库,可以使用composer安装,或者从官网(https://github.com/PHPOffice/PHP…

    PHP 2023年5月26日
    00
  • PHP实现简易blog的制作

    下面给你详细讲解“PHP实现简易blog的制作”的完整攻略。 1. 准备工具 Web服务器:Apache或Nginx 数据库软件:MySQL或MariaDB 编辑器:Sublime Text、Visual Studio Code、PHPStorm等 2. 创建数据库 首先,需要在MySQL或MariaDB中创建一个数据库,用于存储博客的文章和用户信息。 可以…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部