php怎么判断身份证是
时间 : 2023-03-28 10:19:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在PHP语言中,可以通过一些函数来判断一个身份证号码是否正确。身份证号码是一个18位的数字或者17位的数字加上一个字母X,编码规则由**规定,其前17位为省份、出生年月日、性别等信息,最后一位通常为校验码,可以根据前17位的数值推算出来。下面我来介绍一下PHP中可以用来验证身份证号码是否正确的方法。

方法一、使用preg_match()函数

preg_match()是PHP中一个常用的正则表达式匹配函数,可以用来匹配身份证号码的格式是否正确。代码如下:

```php

function isIDCard($id_card) {

$pattern = '/^\d{17}(\d|X)$/';

$isMatch = preg_match($pattern, $id_card);

return $isMatch ? true : false;

}

该函数的实现思路是通过正则表达式来匹配身份证号码的格式,如果匹配成功返回true,否则返回false。

方法二、根据身份证计算校验码

身份证号码的最后一位通常是一个校验码,可以根据前17位数字进行推算得出。校验码的计算方法如下:

1、将前17位数字加权求和,其中检验码除外:

S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和

Ai:表示第i位置上的身份证号码数字值(0~9)

Wi:表示第i位置上的加权因子 加权因子Wi =pow(2,17-i)%11。

2、计算模

Y = mod(S, 11)

3、根据模值得到对应的校验码

(Y == 0) => 1

(Y == 1) => 0

(Y == 2) => X

(Y >= 3 && Y <= 10) => (12-Y)

代码如下:

```php

function isIDCard($id_card) {

if (strlen($id_card) == 18) {

$num = substr($id_card, 0, 17);

$sum_weight = 0;

for ($i = 0; $i < 17; $i++) {

$sum_weight += $num[$i] * pow(2, 17 - $i) % 11;

}

$check_code = $num[17];

if ($check_code == 'X') {

$check_code = 10;

}

$last_code = (12 - $sum_weight % 11) % 11;

if ($last_code == $check_code) {

return true;

}

}

return false;

}

以上两种方法都可以用来判断身份证号码的格式是否正确,其中第二种方法还可以判断身份证号码的校验码是否正确。

要判断身份证是否合法,需要先了解身份证号码的组成。

身份证号码是由18位数字和一个字母组成的,它包含了以下信息:

1.前6位代表出生日期(年月日);

2.第7-14位代表地区代码,表示你的出生地;

3.第15-17位代表你的性别和序列号,一般为奇数表示男性,偶数表示女性;

4.第18位为校验码,用于验证身份证号码的正确性。

下面是判断身份证号码是否合法的PHP代码:

function validate_id_card($id_card){

// 18位身份证验证正则表达式

$reg = '/^(\d{6})(19|20)(\d{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(\d{3})([0-9]|X)$/i';

if(!preg_match($reg, $id_card)){ //验证18位身份证号码格式是否正确

return false;

}else{

$id_card_length = strlen($id_card);

if($id_card_length == 18){ //如果是18位身份证号码,则进行验证

$id_card = str_split($id_card); //将字符串拆分成数组

// 加权因子

$sigma = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);

// 校验码对应值

$verify_code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

$sum = 0;

for($i=0; $i<17; $i++){

$sum += $id_card[$i] * $sigma[$i];

}

$residue = $sum % 11; //计算余数

$verify = $verify_code[$residue]; //获取校验码

if($verify != strtoupper($id_card[17])){ //验证校验码是否正确

return false;

}

}

}

return true;

}

以上代码分为两部分:

第一部分用正则表达式验证身份证号码格式是否正确;

第二部分采用加权求和的方式验证身份证号码的校验码是否正确。

使用该函数,可以方便地判断身份证号码是否合法。