Heim  >  Artikel  >  php教程  >  PHP实现身份证号正则验证(兼容15,18位)

PHP实现身份证号正则验证(兼容15,18位)

WBOY
WBOYOriginal
2016-06-21 08:50:471557Durchsuche

 

最近复习了正则表达式的使用,手痒痒就做了一份验证正则,身份证号验证(兼容15,18位) ,在注册验证的时候可以用上。

 

01 //比较菜鸟 第一次分享代码  

02 //身份证号验证

03     protected function checkIdCard(){

04         if(empty($_POST['idcard'])){

05             return false;

06         }

07         $idcard = $_POST['idcard'];

08         $City = array(11=>"北京",12=>"天津",13=>"河北",14=>"山西",15=>"内蒙古",21=>"辽宁",22=>"吉林",23=>"黑龙江",31=>"上海",32=>"江苏",33=>"浙江",34=>"安徽",35=>"福建",36=>"江西",37=>"山东",41=>"河南",42=>"湖北",43=>"湖南",44=>"广东",45=>"广西",46=>"海南",50=>"重庆",51=>"四川",52=>"贵州",53=>"云南",54=>"西藏",61=>"陕西",62=>"甘肃",63=>"青海",64=>"宁夏",65=>"新疆",71=>"台湾",81=>"香港",82=>"澳门",91=>"国外");

09         $iSum = 0;

10         $idCardLength = strlen($idcard);

11         //长度验证

12         if(!preg_match('/^\d{17}(\dx)$/i',$idcard) and!preg_match('/^\d{15}$/i',$idcard))

13         {

14             return false;

15         }

16         //地区验证

17         if(!array_key_exists(intval(substr($idcard,0,2)),$City))

18         {

19            return false;

20         }

21         // 15位身份证验证生日,转换为18位

22         if ($idCardLength == 15)

23         {

24             $sBirthday = '19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2);

25             $d = new DateTime($sBirthday);

26             $dd = $d->format('Y-m-d');

27             if($sBirthday != $dd)

28             {

29                 return false;

30             }

31             $idcard = substr($idcard,0,6)."19".substr($idcard,6,9);//15to18

32             $Bit18 = getVerifyBit($idcard);//算出第18位校验码

33             $idcard = $idcard.$Bit18;

34         }

35         // 判断是否大于2078年,小于1900年

36         $year = substr($idcard,6,4);

37         if ($year2078 )

38         {

39             return false;

40         }

41  

42         //18位身份证处理

43         $sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2);

44         $d = new DateTime($sBirthday);

45         $dd = $d->format('Y-m-d');

46         if($sBirthday != $dd)

47          {

48             return false;

49          }

50         //身份证编码规范验证

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

52         if(strtoupper(substr($idcard,17,1)) != getVerifyBit($idcard_base))

53         {

54            return false;

55         }

56         return $_POST['idcard'];

57     }

58  

59     // 计算身份证校验码,根据国家标准GB 11643-1999

60     function getVerifyBit($idcard_base)

61     {

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

63         {

64             return false;

65         }

66         //加权因子

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

68         //校验码对应值

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

70         $checksum = 0;

71         for ($i = 0; $i 

72         {

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

74         }

75         $mod = $checksum % 11;

76         $verify_number = $verify_number_list[$mod];

77         return $verify_number;

78     }



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn