功能需求:用户输入混合的收货地址,能智能识别出地址,手机,姓名

  • 能正常识别包含三级其中一项的地址,直白点说就是只包含第三级地区一样能识别出来
  • 代码不完成免费共享了,转为收费(删除部分代码),生活所迫!哈哈……

效果图:
代码:

<?php
class DistinguishAddress {/*** 类的入口方法* 传入地址信息自动识别,并返回最高匹配结果* 如果地址新增,则需要删除缓存文件重新缓存* @param $address*/
function getAddressResult($address){// 优先第一种方法$result = $this->getAddressArrar($address);// 如果结果不理想,再模糊去匹配if($result['level'] != 3){$result_sub = $this->addressVague($address);// 只有全匹配对才替换,否则不做任何改变if($result_sub['level'] == 3){$result = $result_sub;}}// 联系方式-优先匹配电话if(preg_match('/1\d{10}/', $address, $mobiles)){ // 手机$result['mobile'] = $mobiles[0];} else if(preg_match('/(\d{3,4}-)?\d{7,8}/', $address, $mobiles)){ // 固定电话$result['mobile'] = $mobiles[0];}// 识别姓名-必须空格分享的--概率preg_match_all('/[\x{4e00}-\x{9fa5}]{2,}/iu', $address,$names);if($names){$name_where = '';foreach ($names[0] as $name){// 必须是大于1个字符且小于5个字符的if(1 < mb_strlen($name,'utf-8') && mb_strlen($name, 'utf-8') < 5){$sub_name = mb_substr($name, 0, 1, 'utf-8');$name_where .= "name like '{$sub_name}%' or ";}}if(!empty($name_where)){$name_where = substr($name_where, 0, -3);$names_sql = "select name from surname where {$name_where} order by sort desc";$list = Db::getInstance('DbTrade')->getAll($names_sql);// 统计有多少种可能性-姓名$result['name_num'] = count($list);if($list) {$name_first = $list[0]['name'];foreach ($names[0] as $name){$len = mb_strlen($name_first, 'utf-8');if (mb_substr($name, 0, $len, 'utf-8') == $name_first){$result['name'] = $name;}}}}}// 去掉详细里面的姓名和电话$result['info'] = str_replace($result['mobile'], '', $result['info']);$result['info'] = str_replace($result['name'], '', $result['info']);$result['info'] = $result['province']['region_name'] . $result['city']['region_name'] . $result['district']['region_name'] . $result['info'];return $this->getCityLevelList($result);
}/*** 获取对应城市等级列表*/
function getCityLevelList($result){// 获取所有地址递归列表$regions = $this->getRegionTreeList();// 获取省份列表- 只有存在值才返回对应列表$province_id = $result['province']['region_id'];if ($province_id) {foreach ($regions as $region){unset($region['childs']);$result['province_list'][] = $region;}}// 获取城市列表- 只有存在值才返回对应列表$city_id = $result['city']['region_id'];if ($city_id) {foreach ($regions[$province_id]['childs'] as $region){unset($region['childs']);$result['city_list'][] = $region;}}// 获取地区列表- 只有存在值才返回对应列表$district_id = $result['district']['region_id'];if ($district_id) {foreach ($regions[$province_id]['childs'][$city_id]['childs'] as $region){unset($region['childs']);$result['district_list'][] = $region;}}return $result;
}/*** 获取所有地址递归列表*/
function getRegionTreeList(){// IO$file_name = 'regions.json';if(is_file($file_name)){$regions = file_get_contents($file_name);$regions = json_decode($regions, true);} else {$region_sql = "select region_id,region_name,parent_id from region";$regions = Db::getInstance('DbTrade')->getAll($region_sql);$regions = $this->arrayKey($regions);file_put_contents($file_name, json_encode($regions));}return $regions;
}/*** 第一种方法* 根据地址列表递归查找准确地址* @param $address* @return array*/
function getAddressArrar($address){// 获取所有地址递归列表$regions = $this->getRegionTreeList();// 初始化数据$province = $city = $district = array();// 先查找省份-第一级地区$province = $this->checkAddress($address, $regions);if($province){// 查找城市-第二级地区$city = $this->checkAddress($address, $province['list']);if($city){// 查找地区-第三级地区// 西藏自治区那曲市色尼区辽宁南路西藏公路  第三个参数因为这个地址冲突取消强制$district = $this->checkAddress($address, $city['list']);}}return $this->getAddressInfo($address, $province, $city, $district);
}/*** 根据原地址返回详细信息* @param $address* @param $province* @param $city* @param $area* @return array*/
function getAddressInfo($address, $province, $city, $district){// 查找最后出现的地址 - 截取详细信息$find_str = '';if($province['region_name']){$find_str = $province['region_name'];if($city['region_name']){$find_str = $city['region_name'];if($district['region_name']){$find_str = $district['region_name'];}}}// 截取详细的信息$find_str_len = mb_strlen($find_str,'utf-8');for($i=0; $i<$find_str_len-1; $i++){$substr = mb_substr($find_str,0,$find_str_len - $i, 'utf-8');$end_index = mb_strpos($address, $substr);if ($end_index){$address = mb_substr($address, $end_index + mb_strlen($substr) , mb_strlen($address) - $end_index);}}!empty($find_str) && $find_str = '|\S*' . $find_str;$area['info'] = preg_replace("/\s*|,|,|:|:{$find_str}/i", '', $address);$level = 0;if($district['region_name']){$level = 3;} else if($city['region_name']){$level = 2;} else if ($province['region_name']) {$level = 1;}return array('province'  => array('region_id'=>$province['region_id'], 'region_name'=>$province['region_name']),'city'      =>  array('region_id'=>$city['region_id'], 'region_name'=>$city['region_name']),'district'      => array('region_id'=>$district['region_id'], 'region_name'=>$district['region_name']),'info'      => $area['info'],'level'     => $level,);
}/*** 递归所有地址成无限分类数组* @param $data* @param int $region_id* @return array*/
function arrayKey($data, $region_id=1){$result = array();foreach ($data as $row){if($region_id == $row['parent_id']){$key = $row['region_id'];$row['childs'] = $this->arrayKey($data, $row['region_id']);$result[$key] = $row;}}return $result;
}
}
?>
  • 如若有疑问,互相讨论学习!
  • 欢迎联系博文QQ946876689

php智能识别收货地址信息相关推荐

  1. 智能识别收货地址(支持vue)/省市区街道四级联动

    一.智能识别收货地址 解决方案一:smartParsePro 源代码地址: https://github.com/wzc570738205/smartParsePro 使用方法1,在线API: 特别提 ...

  2. web js智能识别收货地址

    一.直接上干货 <!doctype html> <html lang="en"> <head><meta charset="UT ...

  3. 智能识别收货地址 javascript

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 地址: https://github.com/wzc570738205/smart_parse 转载于:https:// ...

  4. 智能识别收货地址 javascript地址智能识别

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 地址: https://github.com/wzc570738205/smart_parse

  5. PHP智能解析收货地址

    有问题,可以加入讨论群 QQ群:825042078 这段代码可以实现剥离出:身份证号,手机号,座机号,右边,同时出去字符里面的一些干扰词,只留下用于解析的详细地址 然后详细地址可以,通过第二段程序,分 ...

  6. 微信小程序获取用户收货地址与指纹验证接口(安卓和iphone)

    @toc 1.获取用户收货地址接口wx.chooseAddress()   wx.chooseAddress(Object object)获取用户收货地址,此接口调用的是微信的收货地址.微信收货地址不 ...

  7. 微信小程序获取用户收货地址 完整代码

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 获取用户收货地址需要用户点击授权,所以有两种情况,确认授权.取消授权. 情况一,用户第一次访问用户地址授权,并 ...

  8. 微信支付开发(6) 收货地址共享接口

    关键字:微信支付 收货地址共享 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-editAddress.html 请看新版教程  微信支付开发 ...

  9. jssdk 获取微信收货地址_微信收货地址共享开发接口讲解

    写在前面的话:微信开发者文档写的比较清楚,也不容易出错,可是偏偏收货地址共享那儿写的比较绕,同时也会有很多坑,这里总结一下. ======正文开始====== 微信收货地址共享开发接口基本使用场景是: ...

最新文章

  1. 移动端实现PDF文件阅读的方法
  2. UseControls ————用户自定义控件的textbox的传值问题
  3. 三维家导入户型镜像怎么使用_【业】1分钟看懂三维家定制柜设计
  4. linux下使用binfmt_misc设定不同二进制的打开程序
  5. Android中垃圾回收日志信息
  6. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)
  7. 网络解析(一):LeNet-5详解
  8. 蚂蚁金服隗华:十五年时间见证分布式数据库的崛起
  9. DreamFacotry 第4章 如何保护REST API
  10. 索尼中国官微吐槽年假被狗吃了 官方称系统故障 理解孩子
  11. JavaScript 盖尔-沙普利算法
  12. 《土豆荣耀》重构笔记(八)添加角色的动画
  13. 过去25年八大计算机病毒:冲击波和震荡波入选
  14. PIR控制器调节器并网逆变器电流谐波抑制策略
  15. java——集合详解
  16. vue实现最简单的打字小游戏
  17. 跨境电商综试区为跨境电商发展添活力
  18. 使用:EXISTS (Transact-SQL)
  19. Python win32com初步实现将批量的Word文件信息统计写入同一Excel表格中
  20. linux下挂载光驱方法,Linux下光驱挂载技巧

热门文章

  1. 通过通达信l2行情接口的逐笔委托中挖掘主力踪迹
  2. 关于Android Studio 中Android SDK的 SDK Tools 没有CMake下载项问题
  3. [转帖]EventHandler部署工具
  4. 给 Linux 系统“减肥”,系统垃圾清理
  5. 帝国cmssitemap.php,帝国CMS-sitemap地图插件下载
  6. 用 java 安装 mockserver_前端工程化-Mock Server:使用Node+json-server+mock.js搭建Mock Server...
  7. 如何使用graphpad做柱形图_Graphpad绘制柱形图&散点图
  8. 【U8+】用友U8+删除发货签回单提示发货单已签回完成或以损失处理
  9. AI 硬件加速的重大飞跃!可训练机器学习硬件的光学芯片
  10. 继电保护整定值计算软件_继电保护的整定计算.doc