使用php检查身份证号码是否正确

有时候需要使用使用php检查身份证号码是否正确

这就需要封装一个函数来实现。

下面这个函数说明了实现过程

/**
  * 检查身份证号码
  * 参数:$sfznum是15位或18位身份证号码,可选参数 $len 可以是15位号码。
  * 返回值:失败返回FALSE,成功返回一个18位的身份证号
  */
 private function checksfznum($sfznum, $len = 'both')
 {
  if (strlen ( $sfznum ) == 15 && $len == 'both') { //当$len不等于'both'时,15位号码无效
   $truenum = substr ( $sfznum, 0, 6 ) . '19' . substr ( $sfznum, 6 ); //为返回18位号码作准备。
   $preg = "/^[\\d]{8}((0[1-9])|(1[0-2]))((0[1-9])|([12][\\d])|(3[01]))[\\d]{3}$/";
  } elseif (strlen ( $sfznum ) == 18) {
   $truenum = substr ( $sfznum, 0, 17 );
   $preg = "/^[\\d]{6}((19[\\d]{2})|(200[0-8]))((0[1-9])|(1[0-2]))((0[1-9])|([12][\\d])|(3[01]))[\\d]{3}[0-9xX]$/";
  } else {
   return false;
  }
  if (! preg_match ( $preg, $sfznum )) {
   return false; //完成正则表达式检测
  }

  
  /*-----------以下计算第18位验证码-------------*/
  $nsum = substr ( $truenum, 0, 1 ) * 7;
  $nsum = $nsum + substr ( $truenum, 1, 1 ) * 9;
  $nsum = $nsum + substr ( $truenum, 2, 1 ) * 10;
  $nsum = $nsum + substr ( $truenum, 3, 1 ) * 5;
  $nsum = $nsum + substr ( $truenum, 4, 1 ) * 8;
  $nsum = $nsum + substr ( $truenum, 5, 1 ) * 4;
  $nsum = $nsum + substr ( $truenum, 6, 1 ) * 2;
  $nsum = $nsum + substr ( $truenum, 7, 1 ) * 1;
  $nsum = $nsum + substr ( $truenum, 8, 1 ) * 6;
  $nsum = $nsum + substr ( $truenum, 9, 1 ) * 3;
  $nsum = $nsum + substr ( $truenum, 10, 1 ) * 7;
  $nsum = $nsum + substr ( $truenum, 11, 1 ) * 9;
  $nsum = $nsum + substr ( $truenum, 12, 1 ) * 10;
  $nsum = $nsum + substr ( $truenum, 13, 1 ) * 5;
  $nsum = $nsum + substr ( $truenum, 14, 1 ) * 8;
  $nsum = $nsum + substr ( $truenum, 15, 1 ) * 4;
  $nsum = $nsum + substr ( $truenum, 16, 1 ) * 2;
  
  
  
  $yzm = 12 - $nsum % 11;
  
  if ($yzm == 10){
   $yzm = 'x';
  } elseif ($yzm == 12) {
   $yzm = '1';
  } elseif ($yzm == 11) {
   $yzm = '0';
  }
   /*----------18位验证码计算完成-------------*/
  if (strlen ( $sfznum ) == 18) {
   if (strtolower(substr($sfznum, 17, 1)) != $yzm)
    return false;
  }
  return $truenum . $yzm;
 }