PHP检测身份证号码两个函数

检测身份证号码,最准确的肯定是通过国家的身份数据中心检测,想想也不知道,这个东西不是这么好弄的,所以下面介绍一个办法,通过前17位来检测,直接上例子了:

  1. <?php
  2. $idCard = '12345678901234567';//身份证号码前17位
  3. $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
  4. $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
  5. $sigma = null;
  6. for ($i = 0; $i < 17; $i++) {
  7. $sigma += ((int) $idCard{$i}) * $wi[$i];
  8. }
  9. echo "身份证号码:".$idCard.$ai[($sigma % 11)];
  10. ?>
  11. //例2代码如下:
  12. function validation_filter_id_card($id_card)
  13. {
  14. if(strlen($id_card) == 18)
  15. {
  16. return idcard_checksum18($id_card);
  17. }
  18. elseif((strlen($id_card) == 15))
  19. {
  20. $id_card = idcard_15to18($id_card);
  21. return idcard_checksum18($id_card);
  22. }
  23. else
  24. {
  25. return false;
  26. }
  27. }
  28. // 计算身份证校验码,根据国家标准GB 11643-1999
  29. function idcard_verify_number($idcard_base)
  30. {
  31. if(strlen($idcard_base) != 17)
  32. {
  33. return false;
  34. }
  35. //加权因子
  36. $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
  37. //校验码对应值
  38. $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
  39. $checksum = 0;
  40. for ($i = 0; $i < strlen($idcard_base); $i++)
  41. {
  42. $checksum += substr($idcard_base, $i, 1) * $factor[$i];
  43. }
  44. $mod = $checksum % 11;
  45. $verify_number = $verify_number_list[$mod];
  46. return $verify_number;
  47. }
  48. // 将15位身份证升级到18位
  49. function idcard_15to18($idcard){
  50. if (strlen($idcard) != 15){
  51. return false;
  52. }else{
  53. // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
  54. if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false){
  55. $idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);
  56. }else{
  57. $idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);
  58. }
  59. }
  60. $idcard = $idcard . idcard_verify_number($idcard);
  61. return $idcard;
  62. }
  63. // 18位身份证校验码有效性检查
  64. function idcard_checksum18($idcard){
  65. if (strlen($idcard) != 18){ return false; }
  66. $idcard_base = substr($idcard, 0, 17);
  67. if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))){
  68. return false;
  69. }else{
  70. return true;
  71. }
  72. }