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

yizhihongxing

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

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开发中,设计模式是一种很常见的编程思想。设计模式是对软件开发中经常出现的问题得出的通用解决方案。下面我将详细讲解PHP中三种常用的设计模式:单例模式、工厂模式、观察者模式。 单例模式 单例模式是一种创建型模式,它的目的是保证一个类只有一个实例,而且提供了一个全局访问该实例的方法。下面是…

    PHP 2023年5月23日
    00
  • php Xdebug的安装与使用详解

    PHP Xdebug的安装与使用详解 什么是PHP Xdebug? Xdebug是一个用于PHP的开源调试器和分析器,它可以帮助开发者调试代码和分析代码性能等问题。Xdebug提供了多种调试功能,如变量实时监控、函数追踪、代码覆盖率分析等。 安装Xdebug 步骤一:安装Xdebug扩展 首先需要下载Xdebug的扩展模块,并将其编译成一个动态链接库,可以通…

    PHP 2023年5月30日
    00
  • 用php发送带附件的Email

    以下是使用PHP发送带附件的Email的完整攻略。 一、准备工作 在使用PHP发送带附件的Email之前,需要准备好以下工作: 确保你已经安装并配置好SMTP服务器,可以使用php.ini文件或PHP邮件类库进行设置。 确保你已经了解PHP邮件类库的使用方法,并按需安装。 确定要发送的附件,并将其存储在服务器磁盘上。 二、发送带附件的Email 发送带附件的…

    PHP 2023年5月26日
    00
  • php基础设计模式大全(注册树模式、工厂模式、单列模式)

    下面我来详细讲解PHP基础设计模式大全中的三种设计模式:注册树模式、工厂模式和单例模式。 注册树模式 注册树模式是一种解决全局共享和交换对象信息的方法,可以通过一个全局的静态类来管理所有对象的创建和使用。这种模式的核心在于使用一个全局的Registry类来维护所有对象的引用,以便全局共享和使用对象。 下面是一个使用注册树模式的代码示例: class Regi…

    PHP 2023年5月23日
    00
  • PHP会话处理的10个函数

    PHP会话处理是指在web应用程序中建立、维护和终止用户会话的过程。PHP提供了10个函数来处理会话,并随着PHP版本的不同而有所变化。下面是这10个函数的详细介绍及示例说明: session_start() session_start()函数用于创建一个会话或者重新打开一个已经存在的会话,它必须在使用任何其它与会话相关函数前调用。例如,下面的示例展示了如何…

    PHP 2023年5月27日
    00
  • 微信小程序 wx.uploadFile无法上传解决办法

    微信小程序 wx.uploadFile无法上传解决办法 问题背景 在开发微信小程序过程中,有时我们需要上传图片等文件到服务器。为此,可以使用微信小程序API中的wx.uploadFile方法来实现文件上传。但在使用wx.uploadFile方法上传时,可能会遇到无法上传的情况。 解决办法 造成无法上传的原因主要有两个:请求header未设置并且文件大小超过1…

    PHP 2023年5月23日
    00
  • php使用strip_tags()去除html标签仍有空白的解决方法

    当使用PHP内置函数strip_tags()去掉字符串中的HTML标签时,有时候会出现一些空白字符。这些空白字符可能来自于HTML标签周围的空格,也可能是由于行末换行符等不可见字符造成的。本文将介绍解决strip_tags()函数会保留空格的方法。 原因分析 造成这个问题的主要原因是HTML标签内的文本如果有空格或换行符等字符,这些字符不是HTML标准定义的…

    PHP 2023年5月26日
    00
  • PHP匿名函数(闭包函数)详解

    PHP匿名函数(闭包函数)详解 什么是匿名函数 匿名函数,也称为闭包函数,是一种可以在运行时定义的函数。匿名函数传统上被用来在代码中定义回调函数,也可以用来避免全局作用域的变量污染。 基本语法 匿名函数的基本语法如下: $my_function = function($param1, $param2, …) use ($var1, $var2, …)…

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