PHP全国省市区地址分割提取脚本程序

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

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

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

主程序代码:

<?php
/**-
 * 省市区地址分割
 * 将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号
 * User: [email protected]
 * 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全国省市区地址分割提取脚本程序

时间: 2024-08-28 18:17:09

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

全国省市区数据库(带拼音、简称、行政编码、邮政编码等)

刚才在网上查询关于全国省市区数据库,比较坑的是数据比较全面的很少,全面的收费,心里很是不爽. 但是最终我还是抠到啦一份稍微不错的全国省市区数据库,并且带左边,简拼,简称,拼音,行政编码,邮政编码,城市三字码的数据. 这里我给大家分享下,希望能给有些需要的同学带去帮助. 创建数据库脚本 CREATE TABLE [dbo].[Region]( [Id] [int] NULL, [Name] [nvarchar](40) NULL, [ParentId] [int] NULL, [ShortName

淘宝地址快速提取插件 for 琴朗淘宝助手

琴朗淘宝助手是一款专为 淘宝卖家 设计的进销存助手软件 ,以人为本,界面简洁大方,极具实用性. 功能完善,不仅是一个活帐本,理财助手, 更是团队协作的完美平台. http://www.onlinedown.net/soft/100324.htm 此软件有一个不错的功能,就是可以自动分解淘宝地址到对应的字段,提高工作效率.如下: 可惜的是,由于淘宝地址格式的升级,以及某些情况出现地址不规范围的情况下.而此软件多时未升级... 所以,不得以... 本人做了一个淘宝地址快速提取插件 for 琴朗淘宝助

下载 LFS所需要的源码包的脚本程序及检验方法

/*********************************************************************  * Author  : Samson  * Date    : 04/27/2015  * Test platform:  *              gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2  *              GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu)

全国省市区数据库,带拼音,简称,行政编码,邮政编码等

前言 刚才在网上查询关于全国省市区数据库,比较坑的是数据比较全面的很少,全面的收费,心里很是不爽. 但是最终我还是抠到啦一份稍微不错的全国省市区数据库,并且带左边,简拼,简称,拼音,行政编码,邮政编码,城市三字码的数据. 这里我给大家分享下,希望能给有些需要的同学带去帮助. 图片效果展示 数据分享 创建数据库脚本 CREATE TABLE [dbo].[Region]( [Id] [int] NULL, [Name] [nvarchar](40) NULL, [ParentId] [int] N

javaWeb数据库动态加载全国省市区三级联动

首先声明一下,全国省市区三级联动有很多的插件.没有必要这么麻烦的把省市区存到数据库,然后再获取.这样缺点很明显: 缺点:使用数据库,每次动态ajax获取数据都要操作一次数据库,增加了数据库的负担.不推荐这样做,直接使用插件比较好. 一些Jquery插件比较省时省力,不用来回操作数据库,就能达到你想要的效果,页面修饰就要自己设计咯.而且使用数据库你还要事先把省市区数据存到数据库,耗费精力,及时有一些现成的sql文件可以导入.但是感觉好麻烦有没有,博主算是试了一次. 好了说了很多废话,开始上代码吧:

cocos2d-js 在线更新代码脚本 动态更新脚本程序 热更新

一.cocos2d-js 动态更新的基本思路 动态更新的好处不言而喻,不需要重新上架审核,能节省很多时间,也能让用户尽快使用上最新的版本,减少下载的成本. 官方BETA版本后提供了AssetsManager类,可以完成动态更新的步骤,说明:https://github.com/chukong/cocos-docs/blob/master/manual/framework/html5/v3/assets-manager/zh.md cocos2d程序安装后,以Android为例,程序存在于2个地方

linux文件夹下递归执行脚本/程序

在linux中,若需要使用某个脚本/程序对文件夹下所有符合条件的文件执行,可采用如下方法: 首先是find命令,用find找出符合条件的待执行文件/文件夹 ## 只列出常规文件 find ./ -type f ## 只列出文件夹 find ./ -type d ## 列出后缀cpp的文件 find -name *.cpp 对找到的所有文件批处理 find ./ -type f -exec chmod 644 {} \; # 后面的\;必须的,表示按行输出 find ./ -type d -exe

09 shell脚本程序练习

练习1:写一个脚本程序,完成以下任务 1.添加五个用户,user1.user2.user3.user4.user5: 2.添加之前先判断是否存在该用户,如果存在则显示"某某用户已存在": 3.每个用户的密码都为redhat,而且要求添加密码完成后不显示命令的执行结果: 4.每个用户添加完成以后,都需要显示"某某用户已经添加成功": 首先要判断用户是否存在,我们通过 id 命令来判断: id user1 #判断user1是否存在 echo "user1 ex

提取全局应用程序集中的dll

如何提取全局应用程序集中的dll GAC路径:C:\WINDOWS\assembly 在资源管理器中打开这个路径看到的东西不能复制,右键中也只有 “卸载” 和 “属性” 两个菜单. 在命令提示符下切换到 C:\WINDOWS\assembly 目录,使用 Copy命令会报找不到文件. 从网上找到了一个方法: “ Subst b: %windir%\assembly 执行完后,会发现硬盘分区多了个B盘,打开后看到了所有assembly下的DLL,于是在这里就搜到了Microsoft.ReportV