PHP全国省市区地址分割提取脚本程序
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全国省市区地址分割提取脚本程序的更多相关文章
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- WebResponse 取出全国省市区的邮编
WebResponse用法(根据省市区地址查询其邮编): class Program { static string url { get; set; } static void Main(string ...
- 创建和运行shell脚本程序
转载请标明http://www.cnblogs.com/winifred-tang94/ 要创建一个shell脚本程序,首先新建一个文本文件,然后在这个文本文件中按照shell编程规则输入shell命 ...
- 三级联动查询全国省市区(xml与数据库)
提供有china.xml和china.sql文件,实现全国省市区的三级联动效果 一.xml实现 import java.awt.EventQueue; import javax.swing.JFram ...
- Xtrabackup每周增量备份脚本程序
Xtrabackup每周增量备份脚本程序(含附件) 程序描述 本程序是一个对percona xtrabackup使用的脚本,它完成了MySQL每周的备份. 程序结构 此程序包含了4个目录(bin. ...
- 中国省市区地址三级联动jQuery插件 案例下载
中国省市区地址三级联动jQuery插件 案例下载 distpicker 是一款可以实现中国省市区地址三级联动jQuery插件.它使用简单,简单设置即可完成中国省市区地址联动效果. 安装 可以通过npm ...
- Linux CAN Shell 测试脚本程序
2012-01-13 22:57:14 为我的开发板2440做二次开发,添加了can驱动,做了驱动测试程序,没理由不添加一个测试脚本程序啊!修改了测试程序,使应用程序更加灵活,添加了一下传递参数.接着 ...
- 09 shell脚本程序练习
练习1:写一个脚本程序,完成以下任务 1.添加五个用户,user1.user2.user3.user4.user5: 2.添加之前先判断是否存在该用户,如果存在则显示“某某用户已存在”: 3.每个用户 ...
- 在Linux中以普通用户开机自动运行脚本程序
测试环境:CentOS6.5 管理员:root 普通用户:test1 实现目标:在Linux启动时,以普通用户test1自动运行位于根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志 ...
随机推荐
- Elasticsearch mapping文档相似性算法
Elasticsearch allows you to configure a scoring algorithm or similarity per field. The similarityset ...
- 监听输入框变化(oninput,onpropertychange,onchange)
oninput,onpropertychange,onchange: oninput是onpropertychange的非IE浏览器版本,支持firefox和opera等浏览器,但有一点不同,它绑定于 ...
- physoft.net网站暂停 www.physoft.cn 正式开通 (菲烁科技, physoft)
physoft.net原本计划以开源代码为主体,由于各种原因代码未能开源.基于这些代码,physoft成立了 菲烁(重庆)科技有限公司 ( www.physoft.cn) ,专注于工业级双目视觉测量, ...
- Seq2SQL :使用强化学习通过自然语言生成SQL
论文: https://einstein.ai/static/images/layouts/research/seq2sql/seq2sql.pdf 数据集:https://github.com/s ...
- MySQL_活动期间单笔订单最高的且满600元 判别是重激活客户还是10月注册客户_20161031
将29号和30号两个需求放到一个表当中 首先都满足在10.29到31号之间单笔订单最高的且满600元 数据结构为一个用户一个订单ID 一行一行的 上面是第一个表 我们当做主表 a 第二个表 我们找注册 ...
- 用PCA降维 (Principal Component Analysis,主成分分析)
参考资料:Mastering Machine Learning With scikit-learn 降维致力于解决三类问题.第一,降维可以缓解维度灾难问题.第二,降维可以在压缩数据的同时让信息损失最 ...
- 【247】◀▶IEW-Unit12
Unit 12 Leisure Activities 1.Model1对应图片分析 2.Model1范文分析 The pie chart shows the six sporting activiti ...
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(4)补充: Java正则表达式Matcher.group(int group)相关类解析
在Java正则表达式的相关类Matcher中,有如下几个方法: - int groupCount() - String group(int group) - int start(int group) ...
- C++读取XML,tinyXml的使用
前言: 最近在开发的过程中,有个需求是对xml进行格式转化,从一种格式转化到另外一种格式.因此,就需要读取xml进行处理.原本打算写成工具在linux下运行,不过后来考虑到和系统结合,最后也就使用了前 ...
- HDU - 1869 六度分离 Floyd多源最短路
六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...