您的位置:

php验证身份证的验证类,php身份证识别

本文目录一览:

php 身份证 正则 检测是否有效怎么写?

你的正则表达式的规则错了。。当然不能执行啦

这是规则。如果你只是拿来主义,就无视吧。

代码长篇大论,是对你负责;说真的,百度没几个愿意自己写那么多字的人。我第二程序是自己写的,试验过了。可以自动把身份证升级到18位,然后验证。

正则表达式其实是来自数学的概念,后来加入了编程语言。正则表达式验证身份证简单,但是有缺点,你的要求是:验证出身年月日,很可惜,正则没办法验证的太完善。也就是说只要符合规则就是正确(比如19940939之类的出生年月。。。),所以写程序就是为了完善它。话说多了= =不采纳也没办法。我自认为我比楼上的好多了。

?php

$s15="/^[0-9]{15}$/";

//15位正则表达式

$s18="/^[0-9]{6}[1]{1}[9]{1}[0-9]{2}[0-1]{1}[0-9]{1}[0-3]{1}[0-9]{1}[0-9]{3}[0-9X]{1}$/";

//18位正则表达式

$sid="18位或者15位身份证";

if(preg_match($s15,$sid) or preg_match($s18,$sid))

//如果满足这两个条件的其中一个,输出echo

echo 'ok';

else

echo 'no';

?

简单不好用,我花了一个小时写了一个15位转18位然后自动验证的函数:

?php

function check($sid)

{

if(strlen($sid)== 15)

//如果是15身份证,进入自动转换程序,把15位升级到18位

{

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

$sid=substr_replace($sid,19,6,0);

$count=array();

for($i=0;$i18;++$i)

{

@$count[$i]=$sid[$i]*$wi[$i];

}

$sum=array_sum($count)%11;

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

$sid=substr_replace($sid,$zuihou[$sum],17,0);

//这个sid是18位的。= = 不信你拿自己的身份证(15位)放过来试验,肯定没错。

}

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

$sum2=array();

for($j=0;$j17;$j++)

{

$sum2[$j]=$sid[$j]*$wi18[$j];

}

$sum2=array_sum($sum2)%11;

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

if($yz[$sum2] == $sid[17])

//如果最后一位和验证号一样,则返回真

return true;

else

return false;

}

$sid="18位或者15位身份证";

if(check($sid))

echo '是正确的身份证';

else

echo '身份证不正确';

?

PHP正则表达式验证身份证号格式是否正确

//身份证正则表达式(15位)

$isIDCard1="/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/";

//身份证正则表达式(18位)

$isIDCard2="/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/";

只给出规则,函数自己写

如何使用PHP实现身份证是否合法的验证

function is_idcard( $id ) 

  $id = strtoupper($id); 

  $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/"; 

  $arr_split = array(); 

  if(!preg_match($regx, $id)) 

  { 

    return FALSE; 

  } 

  if(15==strlen($id)) //检查15位 

  { 

    $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/"; 

  

    @preg_match($regx, $id, $arr_split); 

    //检查生日日期是否正确 

    $dtm_birth = "19".$arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 

    if(!strtotime($dtm_birth)) 

    { 

      return FALSE; 

    } else { 

      return TRUE; 

    } 

  } 

  else      //检查18位 

  { 

    $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/"; 

    @preg_match($regx, $id, $arr_split); 

    $dtm_birth = $arr_split[2] . '/' . $arr_split[3]. '/' .$arr_split[4]; 

    if(!strtotime($dtm_birth)) //检查生日日期是否正确 

    { 

      return FALSE; 

    } 

    else

    { 

      //检验18位身份证的校验码是否正确。 

      //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 

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

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

      $sign = 0; 

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

      { 

        $b = (int) $id{$i}; 

        $w = $arr_int[$i]; 

        $sign += $b * $w; 

      } 

      $n = $sign % 11; 

      $val_num = $arr_ch[$n]; 

      if ($val_num != substr($id,17, 1)) 

      { 

        return FALSE; 

      } //phpfensi.com 

      else

      { 

        return TRUE; 

      } 

    } 

  } 

  

}

PHP 做的后台,如何“实名验证”

实名认证牵涉公安备案系统,请想公安机关申请接口进行验证。

否则只能用身份证生成规则进行验证,但是这样验证不是百分之百准确的

以下附上PHP 身份证规则验证代码

/*/

# CopyRight: zxing

# Document: 检查符合 GB11643-1999 标准的身份证号码的正确性

# File:gb11643_1999.func.php Fri Mar 28 09:42:41 CST 2008 zxing

# Updated:Fri Mar 28 09:42:41 CST 2008

# Note: 调用函数 check_id();

#/*///

$id =array();

$id[] = '370882198601064774';

$id[] = '420502198611281126';

$id[] = '370882198601064770';

$id[] = '370882860106477';

$id[] = '63212519850703214x';

$id[] = '429021198203221006';

$id[] = '429036198203211023';

foreach ($id as $key = $value){

echo check_id($value)?$value.' 是真的!br/': $value.' 是假的!br/';

}

#/*/

/*/

# 函数功能:计算身份证号码中的检校码

# 函数名称:idcard_verify_number

# 参数表 :string $idcard_base 身份证号码的前十七位

# 返回值 :string 检校码

# 更新时间:Fri Mar 28 09:50:19 CST 2008

/*/

function idcard_verify_number($idcard_base){

if (strlen($idcard_base) != 17){

   return false;

}

    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); //debug 加权因子

    $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); //debug 校验码对应值

    $checksum = 0;

    for ($i = 0; $i  strlen($idcard_base); $i++){

        $checksum += substr($idcard_base, $i, 1) * $factor[$i];

    }

    $mod = $checksum % 11;

    $verify_number = $verify_number_list[$mod];

    return $verify_number;

}

/*/

# 函数功能:将15位身份证升级到18位

# 函数名称:idcard_15to18

# 参数表 :string $idcard 十五位身份证号码

# 返回值 :string

# 更新时间:Fri Mar 28 09:49:13 CST 2008

/*/

function idcard_15to18($idcard){

    if (strlen($idcard) != 15){

        return false;

    }else{// 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码

        if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false){

            $idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);

        }else{

            $idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);

        }

    }

    $idcard = $idcard . idcard_verify_number($idcard);

    return $idcard;

}

/*/

# 函数功能:18位身份证校验码有效性检查

# 函数名称:idcard_checksum18

# 参数表 :string $idcard 十八位身份证号码

# 返回值 :bool

# 更新时间:Fri Mar 28 09:48:36 CST 2008

/*/

function idcard_checksum18($idcard){

    if (strlen($idcard) != 18){ return false; }

    $idcard_base = substr($idcard, 0, 17);

    if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))){

        return false;

    }else{

        return true;

    }

}

/*/

# 函数功能:身份证号码检查接口函数

# 函数名称:check_id

# 参数表 :string $idcard 身份证号码

# 返回值 :bool 是否正确

# 更新时间:Fri Mar 28 09:47:43 CST 2008

/*/

function check_id($idcard) {

if(strlen($idcard) == 15 || strlen($idcard) == 18){

   if(strlen($idcard) == 15){

    $idcard = idcard_15to18($idcard);

   }

   if(idcard_checksum18($idcard)){

    return true;

   }else{

    return false;

   }

}else{

   return false;

}

}