1.实现代码如下

/***验证合法性*/functioncheckIdCard($idcard){$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=>"国外");$iSum=0;$idCardLength=strlen($idcard);//长度验证if(!preg_match('/^\d{17}(\d|x)$/i',$idcard)and!preg_match('/^\d{15}$/i',$idcard)){returnfalse;}//地区验证if(!array_key_exists(intval(substr($idcard,0,2)),$City)){returnfalse;}//15位验证生日,转换为18位if($idCardLength==15){$sBirthday='19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2);$d=newDateTime($sBirthday);$dd=$d->format('Y-m-d');if($sBirthday!=$dd){returnfalse;}$idcard=substr($idcard,0,6)."19".substr($idcard,6,9);//15to18$Bit18=getVerifyBit($idcard);//算出第18位校验码$idcard=$idcard.$Bit18;}//判断是否大于2078年,小于1900年$year=substr($idcard,6,4);if($year<1900||$year>2078){returnfalse;}//18位处理$sBirthday=substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2);$d=newDateTime($sBirthday);$dd=$d->format('Y-m-d');if($sBirthday!=$dd){returnfalse;}//编码规范验证$idcard_base=substr($idcard,0,17);if(strtoupper(substr($idcard,17,1))!=$this->getVerifyBit($idcard_base)){returnfalse;}return$idcard;}//计算校验码,根据国家标准GB11643-1999functiongetVerifyBit($idcard_base){if(strlen($idcard_base)!=17){returnfalse;}//加权因子$factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);//校验码对应值$verify_number_list=array('1','0','X','9','8','7','6','5','4','3','2');$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;}