身份证批量转换18位,带18位验证
有身份证的数据表中大部分混合着18位和15位身份证号码,网上有一些软件能做到批量处理但是要收费,我自己就写了一个,由于经验不足,可能转换时有点慢且语句不够简练,但转换出来的数据没有问题,我测试过。部分代码来源于网上,感谢不知名的网友,请诸位给优化一下。对了请问如何添加成附件?另一个代码太长了。
[php]
<?php
//
// +----------------------------------------------------------------------+
// | 本文件名 id_plcl.php |
// +----------------------------------------------------------------------+
// | 说明:从一个混合15和18位身份证信息的文本文件中批量转换出全部是18位身 |
// | 份证的文本文件 |
// | 要求:源文件为: 姓名|身份证号 |
// | 结果:目标文件为:姓名|身份号号|性别|出生日期|最初办证地| |
// | |
// +----------------------------------------------------------------------+
// | 创建时间:2005年8月7日 最后修改时间:2006年3月7日 |
// +----------------------------------------------------------------------+
// | PHP Version 4.12 下测试通过 (\-/) |
// +--------------------------------------------- - - ------ ={ }= --------+
// | Copyright (c) 1997-2002 The PHP Group ) ( |
// +-------------------------------------------------- --- _/ \_ --------+
// \ /
// `-))'
// ((
// \)
//
require ("mycheckidcard.php");
$line = file("XXX.txt"); //以方式打开文件,请改成你的文件!
$j = count($line); //计数
for ($i=0; $i<$j; $i++ )
{
list($name[$i],$id[$i]) = explode("|",$line[$i]);
$name[$i] = trim($name[$i]);
$id[$i] = trim($id[$i]);
$id_len[$i]=strlen($id[$i]); //获得身份证长度。
//*****1、分解为15位和18位及不合格的。*****//
if (($id_len[$i] !== 15) && ($id_len[$i] !== 18))
{
$newline[$i] = $name[$i]."|".$id[$i]."|位数错\n";
$fp = fopen("id_err.txt","a");
fputs($fp,$newline[$i]);
fclose($fp);
echo "位数错<BR>\n";
}
if($id_len[$i] == 15)
{
$date_y_15 = "19" . substr($id[$i],6,2);
$date_m_15 = substr($id[$i],8,2);
$date_d_15 = substr($id[$i],10,2);
if (!checkdate($date_m_15,$date_d_15,$date_y_15))
{
$newline[$i] = $name[$i]."|".$id[$i]."|日期错误!\n";
$fp = fopen("id_err.txt","a");
fputs($fp,$newline[$i]);
fclose($fp);
echo "日期错误!<BR>\n";
}
else //升级15位身份证为18位。
{
$id_6 = substr($id[$i], 0, 6);
$sigma = 0;
$body = $id_6 . $date_y_15 . $date_m_15 . $date_d_15 . substr($id[$i],12,3);
$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
for ($a = 0;$a < 17;$a++)
{
$sigma += ((int) $body{$a}) * $wi[$a];
}
$id[$i]= $body.$ai[($sigma % 11)];
$sex[$i] = ($id[$i]{16}) % 2 ? "男" : "女";
$xzq[$i] = xinzhengqu($id_6);
$sr[$i] = substr($id[$i],6,4) . "-" . substr($id[$i],10,2) . "-" . substr($id[$i],12,2);
$newline[$i] = $id[$i]."|".$name[$i]."|".$sex[$i]."|".$sr[$i]."|".$xzq[$i]."|\n";
$fp = fopen("id_ok.txt","a");
fputs($fp,$newline[$i]);
}
}
if($id_len[$i] == 18)
{
$date_y = substr($id[$i],6,4);
$date_m = substr($id[$i],10,2);
$date_d = substr($id[$i],12,2);
if (!checkdate($date_m,$date_d,$date_y))
{
$newline[$i] = $name[$i]."|".$id[$i]."|日期错误!\n";
$fp = fopen("id_err.txt","a");
fputs($fp,$newline[$i]);
fclose($fp);
}
else
{
$sigma = 0;
$body = substr($id[$i],0,17);
$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
for ($a = 0;$a < 17;$a++)
{
$sigma += ((int) $body{$a}) * $wi[$a];
}
$jyw = $ai[($sigma % 11)];
if ($id[$i]{17} <> $jyw)
{
$newline[$i] = $name[$i]."|".$id[$i]."|校验位错\n";
$fp = fopen("id_err.txt","a");
fputs($fp,$newline[$i]);
echo "校验位错<BR>\n";
}
else
{
$id_6 = substr($id[$i],0,6);
$sex[$i] = ($id[$i]{16}) % 2 ? "男" : "女";
$xzq[$i] = xinzhengqu($id_6);
$sr[$i] = substr($id[$i],6,4) . "-" . substr($id[$i],10,2) . "-" . substr($id[$i],12,2);
$newline[$i] = $id[$i]."|".$name[$i]."|".$sex[$i]."|".$sr[$i]."|".$xzq[$i]."|\n";
$fp = fopen("id_ok.txt","a");
fputs($fp,$newline[$i]);
}
}
}
}
?>
[/php] |