github地址: https://github.com/zmxfree/addressapart

比如将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号,方便excel操作。

目前支持大部分中国省市区地址信息的分割,可以自行更新地址源信息。

主程序代码:

<?php
/**-
* 省市区地址分割
* 将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号
* User: zmxfree@gmail.com
* Date: 14-6-18
* Time: 下午12:52
*/ /**此引入文件应包含全国所有的省市区信息
* 文件格式为多维数组,键是地名,值可以赋一个编号,供回查
* array(
* [0] => array('浙江省' => '1','北京市' => '2','上海市' => '3',...),
* [1] => array('杭州市' => '1-1','宁波市' => '1-2','市辖区(一般的直辖市会分为市辖区和周边地区)' => '2-1,3-1',...),
* [3] => array('西湖区' => '1-1-1','江干区' => '1-1-2','海淀区'=>'2-1-1',...),
* [4] => array('可按需求添加城镇信息')
* )
* 这样的结构CRUD操作很方便,不需要严格按照省市区结构分配。
*/
$address = include('address.info.php');
$cache_file = 'lenarr.cache.php';
mb_internal_encoding('utf8');
$len_arr = array();
if (is_file($cache_file) && is_readable($cache_file)) {
//读取省市区长度缓存
$len_arr = include($cache_file);
} else {
$fp = fopen($cache_file, 'w');
//省市区的数量有很多,但长度却是有限的,直接计算出长度,用长度去匹配,大大减少匹配次数
$len_arr[] = array_values(array_unique(array_map('mb_strlen', array_keys($address[0])))); //所有省的长度
$len_arr[] = array_values(array_unique(array_map('mb_strlen', array_keys($address[1])))); //市的长度
$len_arr[] = array_values(array_unique(array_map('mb_strlen', array_keys($address[2])))); //区的长度
//保存文件缓存
$result = fwrite($fp, '<?php return ' . var_export($len_arr, true) . ';?>');
fclose($fp);
} //读取要分割的地址
$f = './address.log';
$fstr = is_file($f) && is_readable($f) ? file_get_contents($f) : '';
$add_arr = explode("\n", $fstr); if (is_array($add_arr)) {
foreach ($add_arr as $addr) {
//初始化
$l = 0;
$i = 0;
$p = 0;
$find = false;
$arr_get = array();
$addr = trim($addr); while (!$find) {
//判断是否超出lenarr数组的长度
if (!isset($len_arr[$l])) {
$arr_get[] = mb_substr($addr, $p, null);
$find = true;
break;
} //截取地址
$ad = mb_substr($addr, $p, $len_arr[$l][$i]);
//匹配,匹配到就进入下一层级即$l++
if (isset($address[$l][$ad])) {
$arr_get[] = $ad; //存储值
$p += $len_arr[$l][$i];
$i = 0;
$l++;
continue;
}
$i++; //判断当前层级是否循环完毕
//当前层级循环完毕仍未匹配到,则循环下一层级,一般是直辖市比如北京市海淀区这种情况,或者是信息不全
if (isset($len_arr[$l]) && $i >= count($len_arr[$l])) {
echo $ad . '<br/>'; //记录下来
$i = 0;
$l++;
continue;
}
}
//分割好的地址写入文件
file_put_contents('address.detail', implode("\t", $arr_get) . "\n", FILE_APPEND);
}
}

PHP全国省市区地址分割提取脚本程序的更多相关文章

  1. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  2. WebResponse 取出全国省市区的邮编

    WebResponse用法(根据省市区地址查询其邮编): class Program { static string url { get; set; } static void Main(string ...

  3. 创建和运行shell脚本程序

    转载请标明http://www.cnblogs.com/winifred-tang94/ 要创建一个shell脚本程序,首先新建一个文本文件,然后在这个文本文件中按照shell编程规则输入shell命 ...

  4. 三级联动查询全国省市区(xml与数据库)

    提供有china.xml和china.sql文件,实现全国省市区的三级联动效果 一.xml实现 import java.awt.EventQueue; import javax.swing.JFram ...

  5. Xtrabackup每周增量备份脚本程序

    Xtrabackup每周增量备份脚本程序(含附件)   程序描述 本程序是一个对percona xtrabackup使用的脚本,它完成了MySQL每周的备份. 程序结构 此程序包含了4个目录(bin. ...

  6. 中国省市区地址三级联动jQuery插件 案例下载

    中国省市区地址三级联动jQuery插件 案例下载 distpicker 是一款可以实现中国省市区地址三级联动jQuery插件.它使用简单,简单设置即可完成中国省市区地址联动效果. 安装 可以通过npm ...

  7. Linux CAN Shell 测试脚本程序

    2012-01-13 22:57:14 为我的开发板2440做二次开发,添加了can驱动,做了驱动测试程序,没理由不添加一个测试脚本程序啊!修改了测试程序,使应用程序更加灵活,添加了一下传递参数.接着 ...

  8. 09 shell脚本程序练习

    练习1:写一个脚本程序,完成以下任务 1.添加五个用户,user1.user2.user3.user4.user5: 2.添加之前先判断是否存在该用户,如果存在则显示“某某用户已存在”: 3.每个用户 ...

  9. 在Linux中以普通用户开机自动运行脚本程序

    测试环境:CentOS6.5 管理员:root 普通用户:test1 实现目标:在Linux启动时,以普通用户test1自动运行位于根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志 ...

随机推荐

  1. 分享知识-快乐自己:搭建第一个 Hibernate (Demo)

    使用 Hibernate 完成持久化操作 七大 步骤: 1.读取并解析配置文件及映射文件: Configuration configuration=new Configuration().config ...

  2. listen 74

    Genes Link Touch and Hearing Sound and touch may seem completely separate, except possibly when play ...

  3. hls协议(最清晰的讲解)

    今天来介绍一下HLS协议,这个协议是由苹果公司提出并推广开来的.来一段维基百科的定义. HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议.是 ...

  4. ACM学习历程——UVA11111 Generalized Matrioshkas(栈)

    Description   Problem B - Generalized Matrioshkas   Problem B - Generalized Matrioshkas  Vladimir wo ...

  5. 洛谷 P5061 秘密任务 —— 二分图

    题目:https://www.luogu.org/problemnew/show/P5061 首先,“配合默契”就是连边的意思: 但发现答案不好统计,因为有连边的两个点可以分在一组,也可以不分在一组: ...

  6. Python 模拟post请求

    # coding:utf-8import requestsurl = "https://passport.cnblogs.com/user/signin" # 接口地址 # 消息头 ...

  7. cocos2dx 3.0 用ClippingNode做游戏的新手引导

    转自:http://blog.csdn.net/star530/article/details/20851263 本篇介绍的是用ClippingNode 做游戏的新手引导,额,或者说是做新手引导的一种 ...

  8. IOS推流 搭建环境

    效果图 iTools有点卡, 但是推到服务器倒是很快的. 推流 前言 这篇blog是iOS视频直播初窥:<喵播APP>的一个补充. 因为之前传到github上的项目中没有集成视频的推流.有 ...

  9. Open Live Writer测试

    ************************我是可爱的分界线***************************

  10. 【机器学习】随机森林RF

    随机森林(RF, RandomForest)包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定.通过自助法(boot-strap)重采样技术,不断生成训练样本和测试样本,由训练样本 ...