PHP 验证身份证是否合法的函数

  1. functionis_idcard($id)
  2. {
  3. $id=strtoupper($id);
  4. $regx="/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
  5. $arr_split=array();
  6. if(!<a href="/tags.php/preg_match/" target="_blank">preg_match</a>($regx,$id))
  7. {
  8. returnFALSE;
  9. }
  10. if(15==strlen($id))//检查15位
  11. {
  12. $regx="/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";
  13. @preg_match($regx,$id,$arr_split);
  14. //检查生日日期是否正确
  15. $dtm_birth="19".$arr_split[2] .'/'.$arr_split[3].'/'.$arr_split[4];
  16. if(!<a href="/tags.php/strtotime/" target="_blank">strtotime</a>($dtm_birth))
  17. {
  18. returnFALSE;
  19. }
  20. else
  21. {
  22. returnTRUE;
  23. }
  24. }
  25. else//检查18位
  26. {
  27. $regx="/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
  28. @preg_match($regx,$id,$arr_split);
  29. $dtm_birth=$arr_split[2] .'/'.$arr_split[3].'/'.$arr_split[4];
  30. if(!strtotime($dtm_birth))//检查生日日期是否正确
  31. {
  32. returnFALSE;
  33. }
  34. else
  35. {
  36. //检验18位身份证的校验码是否正确。
  37. //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
  38. $arr_int=array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
  39. $arr_ch=array(Ƈ',Ɔ','X',Ə',Ǝ',ƍ',ƌ',Ƌ',Ɗ',Ɖ',ƈ');
  40. $sign= 0;
  41. for($i= 0;$i< 17;$i++ )
  42. {
  43. $b= (int)$id{$i};
  44. $w=$arr_int[$i];
  45. $sign+=$b*$w;
  46. }
  47. $n=$sign% 11;
  48. $val_num=$arr_ch[$n];
  49. if($val_num!=<a href="/tags.php/substr/" target="_blank">substr</a>($id,17, 1))
  50. {
  51. returnFALSE;
  52. }
  53. else
  54. {
  55. returnTRUE;
  56. }
  57. }
  58. }
  59. }