JS寄快递地址智能解析的实现代码
去年做了些前端内容,最近在整理一些稍微有点用的内容,比如智能解析地址,用户只要输入:张三1351111111江苏省扬州市广陵区XX小区X楼xxx室,就能解析出姓名、电话、省市区、地址信息了。是不是很方便?
项目地址暂时没有放,大家可以关注我的个人码云地址https://gitee.com/w9
纯JavaScript,无需Jquery,轻量级的JS包。可参考以下代码:
letdefaultData=[];
constmCity={};
constmArea={};
/**
*处理原始地址数据转换成专用数据
*@paramlist原始数据
*@paraminit是否初始化如传空已转换过不会再次转换
*@returns{boolean}
*/
functionparseArea(list,init){
if(!init&&defaultData.length){
returntrue;
}
defaultData=list;
defaultData.forEach(province=>{
if(province.city){
province.city.forEach(city=>{
if(city.name!=='其他'){
if(!mCity[city.name]){
mCity[city.name]=[];
}
mCity[city.name].push({
p:province.name,
c:city.name,
a:city.area||[]
});
}
if(city.area){
city.area.forEach(area=>{
if(area!=='其他'){
if(!mArea[area]){
mArea[area]=[];
}
mArea[area].push({
p:province.name,
c:city.name
})
}
})
}
})
}
});
}
/**
*解析邮编
*@param
*@returns
*/
functionzipCodeFormat(){
letlist=[]
zipCode.forEach((el)=>{
if(el.child){
el.child.forEach((event)=>{
if(event.child){
event.child.forEach(element=>{
list.push(element.zipcode)
})
}
})
}
})
returnlist;
}
//专用数据处理
letzipCodeList=zipCodeFormat();//邮编
parseArea(areaList);//地址
/**
*解析
*@paramaddress任意地址字符串
*@returns{{name:string,mobile:string,detail:string,zip_code:string,phone:string}}
*/
functionparse(address){
address=address||'';
constparse={
name:'',
mobile:'',
detail:'',
zip_code:'',
phone:''
};
//去除空格...
address=address.replace(/\r\n/g,'').replace(/\n/g,'').replace(/\t/g,'');
address=address.replace(/\s+/g,"");
//自定义去除关键字,可自行添加
constsearch=['地址','收货地址','收货人','收件人','收货','邮编','电话',':',':',';',';',',',',','。',];
search.forEach(str=>{
address=address.replace(newRegExp(str,'g'),'')
});
//多个空格replace为一个
address=address.replace(/{2,}/g,'');
//整理电话格式
address=address.replace(/(\d{3})-(\d{4})-(\d{4})/g,'$1$2$3');
address=address.replace(/(\d{3})(\d{4})(\d{4})/g,'$1$2$3');
constmobileReg=/(86-[1][0-9]{10})|(86[1][0-9]{10})|([1][0-9]{10})/g;
constmobile=mobileReg.exec(address);
if(mobile){
parse.mobile=mobile[0];
address=address.replace(mobile[0],'')
}
//电话
constphoneReg=/(([0-9]{3,4}-)[0-9]{7,8})|([0-9]{12})|([0-9]{11})|([0-9]{10})|([0-9]{9})|([0-9]{8})|([0-9]{7})/g;
constphone=phoneReg.exec(address);
if(phone){
parse.phone=phone[0];
address=address.replace(phone[0],'')
}
//邮编(加入门牌号;考虑到重复邮编问题;去除之前简单的六位数字校验)
for(letindex=0;indexignoreArea(忽略区)');
}else{
//console.log('smart_parse');
}
//这个待完善
constlist=address.replace(detail.province,'').replace(detail.city,'').replace(detail.area,'').split('').filter(str=>str);
//详细住址划分关键字
//注意:只需要填写关键字最后一位即可:比如单元填写元即可!
constaddress_detail_list=['室','楼','元','号','幢','门','户'];
if(list.length>1){
list.forEach(str=>{
if(!parse.name||str&&str.length{
key.push(detail.addr.indexOf(el))
})
varmax=key.sort(function(a,b){
returnb-a;
})[0];
if(max!=-1){
letaddrBuild=detail.addr.slice(0,max+1);
letaddrNum=detail.addr.replace(addrBuild,'').replace(/[^0-9]+/g,'');
letuserName=detail.addr.replace(addrBuild+addrNum,'')
detail.addr=addrBuild+addrNum
parse.name=userName
}
}
}else{
if(detail.name){
parse.name=detail.name
}else{
constlist=detail.addr.split('').filter(str=>str);
if(list.length>1){
parse.name=list[list.length-1]
}
if(parse.name){
detail.addr=detail.addr.replace(parse.name,'').trim()
}
}
}
parse.province=detail.province;
parse.city=detail.city;
parse.area=detail.area;
parse.addr=detail.addr;
parse.result=detail.result;
returnparse;
}
/**
*正向解析模式
*从前到后按provincecityaddr逐级筛选
*有city的值即可说明解析成功
*此模式对地址顺序有要求
*@paramaddress
*@returns{{province:string,city:string,area:string,addr:string}}
*/
functiondetail_parse_forward(address){
constparse={
province:'',
city:'',
area:'',
addr:'',
name:'',
};
constprovinceKey=['特别行政区','古自治区','维吾尔自治区','壮族自治区','回族自治区','自治区','省省直辖','省','市'];
constcityKey=['布依族苗族自治州','苗族侗族自治州','自治州','州','市','县'];
for(letiindefaultData){
constprovince=defaultData[i];
letindex=address.indexOf(province.name);
if(index>-1){
if(index>0){
//省份不是在第一位,在省份之前的字段识别为名称
parse.name=address.substr(0,index).trim();
}
parse.province=province.name;
address=address.substr(index+province.name.length);
for(letkinprovinceKey){
if(address.indexOf(provinceKey[k])===0){
address=address.substr(provinceKey[k].length);
}
}
for(letjinprovince.city){
constcity=province.city[j];
index=address.indexOf(city.name);
if(index>-1&&index<3){
parse.city=city.name;
address=address.substr(index+parse.city.length);
for(letkincityKey){
if(address.indexOf(cityKey[k])===0){
address=address.substr(cityKey[k].length);
}
}
if(city.area){
for(letkincity.area){
constarea=city.area[k];
index=address.indexOf(area);
if(index>-1&&index<3){
parse.area=area;
address=address.substr(index+parse.area.length);
break;
}
}
}
break;
}
}
parse.addr=address.trim();
break;
}
}
returnparse;
}
/**
*逆向解析从后【县,区,旗】往前解析
*有地区就能大概返回地址了
*@paramaddress
*@paramignoreArea是否忽视区因为地址中含有区容易导致匹配错误例:山东省蓬莱市黄海花园东区西门宝威学堂曲荣声收15753572456
*@returns{{province:string,city:string,area:string,name:string,_area:string,addr:string}}
*/
functiondetail_parse(address,{
ignoreArea=false
}={}){
constparse={
province:'',
city:'',
area:'',
name:'',
_area:'',
addr:'',
};
letareaIndex=-1,
cityIndex=-1;
address=address.replace('','');
if(!ignoreArea&&address.indexOf('县')>-1||!ignoreArea&&address.indexOf('区')>-1||!ignoreArea&&address.indexOf('旗')>-1){
if(address.indexOf('旗')>-1){
areaIndex=address.indexOf('旗');
parse.area=address.substr(areaIndex-1,2);
}
if(address.indexOf('区')>-1){
areaIndex=address.indexOf('区');
if(address.lastIndexOf('市',areaIndex)>-1){
cityIndex=address.lastIndexOf('市',areaIndex);
parse.area=address.substr(cityIndex+1,areaIndex-cityIndex);
}else{
parse.area=address.substr(areaIndex-2,3);
}
}
if(address.indexOf('县')>-1){
areaIndex=address.lastIndexOf('县');
if(address.lastIndexOf('市',areaIndex)>-1){
cityIndex=address.lastIndexOf('市',areaIndex);
parse.area=address.substr(cityIndex+1,areaIndex-cityIndex);
}else{
parse.area=address.substr(areaIndex-2,3);
}
}
parse.addr=address.substr(areaIndex+1);
}else{
if(address.indexOf('市')>-1){
areaIndex=address.indexOf('市');
parse.area=address.substr(areaIndex-2,3);
parse.addr=address.substr(areaIndex+1);
}else{
parse.addr=address
}
}
if(address.indexOf('市')>-1||address.indexOf('盟')>-1||address.indexOf('州')>-1){
if(address.indexOf('市')>-1){
parse._area=address.substr(address.indexOf('市')-2,2);
}
if(address.indexOf('盟')>-1&&!mCity[parse._area]){
parse._area=address.substr(address.indexOf('盟')-2,2);
}
if(address.indexOf('州')>-1&&!mCity[parse._area]){
parse._area=address.substr(address.indexOf('州')-2,2);
}
}
parse.area=parse.area.trim();
if(parse.area&&mArea[parse.area]){
if(mArea[parse.area].length===1){
parse.province=mArea[parse.area][0].p;
parse.city=mArea[parse.area][0].c
}else{
parse._area=parse._area.trim();
constaddr=address.substr(0,areaIndex);
constd=mArea[parse.area].find(item=>{
returnitem.p.indexOf(addr)>-1||item.c===parse._area;
});
if(d){
parse.province=d.p;
parse.city=d.c
}else{
parse.result=mArea[parse.area];
}
}
}else{
if(parse._area){
constcity=mCity[parse._area];
if(city){
parse.province=city[0].p;
parse.city=city[0].c;
parse.addr=address.substr(address.indexOf(parse.city)+parse.city.length+1);
parse.area='';
for(letiincity[0].a){
if(parse.addr.indexOf(city[0].a[i])===0){
parse.area=city[0].a[i];
parse.addr=parse.addr.replace(city[0].a[i],'');
break;
}
}
}
}else{
parse.area='';
}
}
parse.addr=parse.addr.trim();
returnparse
}
/*export{parseArea}
exportdefaultparse;*/
下面介绍部分使用实例:
Html
JavaScript
//智能识别地址
functionsmart_parse2(){
varvalue=$('.sj_textarea').val();
console.log(parse(value));//这里可以看一下解析出来的内容
varhtml='';
for(varkeyinparse(value)){
if(parse(value)[key]){
html+=``+key+`:`+parse(value)[key]+`
`
}
}//把解析的内容在赋值到页面元素中(这儿业务使用的Jq,实际上不需要)
$('#sj_name').val(parse(value).name);
$('#sj_phone').val(parse(value).phone);
$('#city-picker2').val(parse(value).province+''+parse(value).city+''+parse(value).area);
$('#sj_addr').val(parse(value).addr);
}
使用起来非常方便,容错率也高。
到此这篇关于JS寄快递地址智能解析的文章就介绍到这了,更多相关js寄快递内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!