本帖最后由 wenwen16396 于 2011-03-06 11:09:08 编辑

解决方案 »

  1.   

    简单的话将你的预定义表导入数组,用preg_replace甚至str_replace(写得好的话后者运行更快)替换就可以了但实际上这里涉及汉语的理解问题,不是电脑能完全完成的,例如“新市”怎样理解?如果仅仅出现“吉林”应该理解为“吉林省”还是“吉林市”?少数民族地区的地名可能更多歧义
      

  2.   

    可以不可以根据表2与省份表的区号来匹配,相同就插入省份与城市。SQL语句是这样写的:UPDATE china_1 a, config_area b SET a.province = b.area_province,a.city = b.area_city WHERE a.telecode = b.area_telecode 如果使用PHP语言该如何操作呢?
      

  3.   

    一个简单粗糙的做法。
    对于自治区和黑龙江无法匹配,得要继续修改代码。header("content-type:text/html;charset=gbk");
    $s = <<<eof
    江门市新会区松业办公家具有限公司
    北京天之健办公家具展览有限公司
    北京市次渠龙鑫美办公家具厂
    天津市盛通达办公设备商行
    济南市历城区日超办公用品厂
    常州市武进区横林强力办公设备厂
    中山市中泰龙办公用品有限公司
    苏州市奇龙办公设备有限公司
    广东名派办公家具制造有限公司
    珠海中融信达办公设备商行
    北京鑫惠办公设备有限公司
    北京爱德天办公家具制造有限公司
    北京天之健办公家具有限公司
    洛阳市华惠办公家具有限公司
    福州市台江区夏威办公设备经营部
    广州一铭办公家具有限公司
    eof;
    $province = array("广东"=>array("江门","中山","珠海","广州"),
    "北京"=>array("北京"),
    "天津"=>array("天津"),
    "江苏"=>array("常州","苏州"),
    "福建"=>array("福州"),
    "山东"=>array("济南")
    );
    $zxs = array("北京","上海","天津","重庆");preg_match_all('/(.{4}).*\n/i',$s,$arr);
    foreach($arr[1] as $i=>$v){
      if(!array_key_exists($v,$province)){
          foreach($province as $k=>$kv){
            if(in_array($v,$kv)){
              if(preg_match("/".$v."市/",$arr[0][$i])){
                echo $k."省 ".preg_replace("/".$v."市/",$v."市 ",$arr[0][$i])."<br />\n";
              }else{
                echo $k."省 ".preg_replace("/".$v."/",$v."市 ",$arr[0][$i])."<br />\n";
              }
            }
        }
      }else{
        if(in_array($v,$zxs)){
          if(preg_match("/".$v."市/",$arr[0][$i])){
            echo preg_replace("/".$v."市/",$v."市 ",$arr[0][$i])."<br />\n";
          }else{
            echo preg_replace("/".$v."/",$v."市 ",$arr[0][$i])."<br />\n";
          }
        }else{
          if(preg_match("/".$v."省/",$arr[0][$i])){
            echo preg_replace("/".$v."省/",$v."省 ",$arr[0][$i])."<br />\n";
          }else{
            echo preg_replace("/".$v."/",$v."省 ",$arr[0][$i])."<br />\n";
          }
        }
      }
    }
      

  4.   

    预期说是正则匹配,到不如说是寻找的内容(公司所在地)与城市数据字典如何匹配,那就要分析数据字典里面有多少特殊情况,除了特殊情况之外的匹配是一个什么规则(直辖市的问题、带不带"市"、字数问题等),特殊情况则要特殊对待(例如吉林的问题)程序逻辑描述如下
    <?php // 因为是中文匹配,为了规范统一,用utf8编码作处理
    mb_internal_encoding("UTF-8");/**
     * 寻找省份/直辖市/自治区
     * @param string $content 找到省份以后,自动去掉找到的省份内容
     * @retrun string 寻找到省份/直辖市/自治区名
     */
    function findProvince(&$content) {

    $province = '';

    // 匹配省份/直辖市/自治区的快捷寻找
    foreach(array('省', '市', '自治区') as $find) {
    $pos = mb_string($content, $find);
    if($pos !== false) {
    // 内容含有寻找的内容
    $province = mb_substr($content, 0, $pos);

    // 是否存在这个省
    if(findProvinceByName($province)) {
    // 内容去掉省份
    $content = mb_substr($content, $pos + 1);
    return $province;
    }

    }
    }

    // 根据省份命名规则的最大长度匹配省份,从1开始是因为最少要2字
    $minlen = 1;
    $maxlen = 9;
    for($i = $minlen; $i < $maxlen - 1; $i++) {
    $province = mb_substr($content, $i, $maxlen);

    foreach(array('省', '市', '自治区') as $fix) {
    // 是否存在这个省
    if(findProvinceByName($province + $fix)) {
    // 内容去掉省份
    $content = mb_substr($content, $pos + 1);
    return $province;
    }
    }

    }

    // 没有找到省份
    return '';
    }/**
     * 按名称寻找省份/直辖市/自治区
     * @param string $name
     * @retrun string 寻找到省份/直辖市/自治区名
     */
    function findProvinceByName($name) {

    // 所有的省份/直辖市/自治区(全称,你可以自行设计)
    $provinces = array();

    return array_search($name, $provinces);
    }/**
     * 寻找城市
     * @param string $content 找到城市以后,自动去掉找到的城市内容
     * @retrun string 寻找到城市名
     */
    function findCity(&$content) {

    // 第一轮寻找直辖市过后,理论上出现的“市”不会再有直辖市
    $find = '市';
    $pos = mb_string($content, $find);
    if($pos !== false) {
    // 内容含有寻找的内容
    $city = mb_substr($content, 0, $pos);

    // 是否存在这个城市
    if(findCityByName($city)) {
    // 内容去掉城市
    $content = mb_substr($content, $pos + 1);
    return $city;
    }

    }

    // 根据城市命名规则的最大长度匹配城市,从1开始是因为最少要2字
    $minlen = 1;
    $maxlen = 9;
    for($i = $minlen; $i < $maxlen - 1; $i++) {
    $city = mb_substr($content, $i, $maxlen);

    $fix = '市';
    // 是否存在这个城市
    if(findCityByName($city + $fix)) {
    // 内容去掉城市
    $content = mb_substr($content, $pos + 1);
    return $city;
    }

    }
    return '';
    }/**
     * 根据城市寻找省份
     * @param string $city
     * @retrun string 寻找到省份
     */
    function findProvinceByCity($city) {
    // 省份与城市的关联数据(全称 例如array('中山市'=>'广东省')
    $province_cities = array();

    if(isset($province_cities[$city])) {
    return $province_cities[$city];
    } else {
    throw new Exception($city . ' : 未找到省份关联', 2);
    }
    }/**
     * 寻找城市
     * @param string $name
     * @retrun string 寻找到的城市(省份+城市)
     */
    function findCityByName($name) {
    // 所有城市集合(全称,你可以自行设计)
    $cities = array();

    return array_search($name, $cities);
    }// 将内容分割成数组
    $findContents = array();foreach($findContents as $content) {

    // 先找省份 也就是“吉林”永远首先匹配“吉林省”
    $province = findProvince($content);

    $city = findCity($content);

    // 没有找到省份
    if(!$province) {

    if(!$city) {
    // 没有找到城市,报错修改规则吧
    throw new Exception($content . ': 没有找到任何规则匹配', 1);
    }

    // 内容只包含有城市信息
    $province = findProvinceByCity($city);
    }

    // 自行定义输出模式
    echo $province . ' ' . $city . ' ' . $content;
    }
    未经任何测试 只是一个大概思路
      

  5.   

    life169,你好!
    能介绍一下这个正则表达式吗?'/(.{4}).*\n/i'我测式的时候,这个正则表达式不成立,不能匹配到省份或城市
      

  6.   


    我用的是gbk编码  而你用的是utf-8编码
    utf8是3字节  gbk是2字节
    当然不能匹配了
      

  7.   

    utf-8的用这个header("content-type:text/html;charset=utf-8");
    $s = <<<eof
    江门市新会区松业办公家具有限公司
    北京天之健办公家具展览有限公司
    北京市次渠龙鑫美办公家具厂
    天津市盛通达办公设备商行
    济南市历城区日超办公用品厂
    常州市武进区横林强力办公设备厂
    中山市中泰龙办公用品有限公司
    苏州市奇龙办公设备有限公司
    广东名派办公家具制造有限公司
    珠海中融信达办公设备商行
    北京鑫惠办公设备有限公司
    北京爱德天办公家具制造有限公司
    北京天之健办公家具有限公司
    洛阳市华惠办公家具有限公司
    福州市台江区夏威办公设备经营部
    广州一铭办公家具有限公司
    eof;
    $province = array("广东"=>array("江门","中山","珠海","广州"),
    "北京"=>array("北京"),
    "天津"=>array("天津"),
    "江苏"=>array("常州","苏州"),
    "福建"=>array("福州"),
    "山东"=>array("济南")
    );
    $zxs = array("北京","上海","天津","重庆");preg_match_all('/(.{6}).*\n/i',$s,$arr);
    foreach($arr[1] as $i=>$v){
      if(!array_key_exists($v,$province)){
          foreach($province as $k=>$kv){
            if(in_array($v,$kv)){
              if(preg_match("/".$v."市/",$arr[0][$i])){
                echo $k."省 ".preg_replace("/".$v."市/",$v."市 ",$arr[0][$i])."<br />\n";
              }else{
                echo $k."省 ".preg_replace("/".$v."/",$v."市 ",$arr[0][$i])."<br />\n";
              }
            }
        }
      }else{
        if(in_array($v,$zxs)){
          if(preg_match("/".$v."市/",$arr[0][$i])){
            echo preg_replace("/".$v."市/",$v."市 ",$arr[0][$i])."<br />\n";
          }else{
            echo preg_replace("/".$v."/",$v."市 ",$arr[0][$i])."<br />\n";
          }
        }else{
          if(preg_match("/".$v."省/",$arr[0][$i])){
            echo preg_replace("/".$v."省/",$v."省 ",$arr[0][$i])."<br />\n";
          }else{
            echo preg_replace("/".$v."/",$v."省 ",$arr[0][$i])."<br />\n";
          }
        }
      }
    }?>
      

  8.   

    处理时用 uft-8 编码要省事的多header('Content-type: text/html;charset=utf-8');/* 假定文档时 gbk 编码的 */
    $s = <<< TEXT
    江门市新会区松业办公家具有限公司
    北京天之健办公家具展览有限公司
    北京市次渠龙鑫美办公家具厂
    天津市盛通达办公设备商行
    济南市历城区日超办公用品厂
    常州市武进区横林强力办公设备厂
    中山市中泰龙办公用品有限公司
    苏州市奇龙办公设备有限公司
    广东名派办公家具制造有限公司
    珠海中融信达办公设备商行
    北京鑫惠办公设备有限公司
    北京爱德天办公家具制造有限公司
    北京天之健办公家具有限公司
    洛阳市华惠办公家具有限公司
    福州市台江区夏威办公设备经营部
    广州一铭办公家具有限公司
    TEXT;$s = iconv('gbk', 'utf-8', $s);
    $p = iconv('gbk', 'utf-8', "/^(..)[市]?(.+)/um");
    preg_match_all($p, $s, $r);
    print_r($r);
    Array
    (
        [0] => Array
            (
                [0] => 江门市新会区松业办公家具有限公司
                [1] => 北京天之健办公家具展览有限公司
                [2] => 北京市次渠龙鑫美办公家具厂
                [3] => 天津市盛通达办公设备商行
                [4] => 济南市历城区日超办公用品厂
                [5] => 常州市武进区横林强力办公设备厂
                [6] => 中山市中泰龙办公用品有限公司
                [7] => 苏州市奇龙办公设备有限公司
                [8] => 广东名派办公家具制造有限公司
                [9] => 珠海中融信达办公设备商行
                [10] => 北京鑫惠办公设备有限公司
                [11] => 北京爱德天办公家具制造有限公司
                [12] => 北京天之健办公家具有限公司
                [13] => 洛阳市华惠办公家具有限公司
                [14] => 福州市台江区夏威办公设备经营部
                [15] => 广州一铭办公家具有限公司
            )    [1] => Array
            (
                [0] => 江门
                [1] => 北京
                [2] => 北京
                [3] => 天津
                [4] => 济南
                [5] => 常州
                [6] => 中山
                [7] => 苏州
                [8] => 广东
                [9] => 珠海
                [10] => 北京
                [11] => 北京
                [12] => 北京
                [13] => 洛阳
                [14] => 福州
                [15] => 广州
            )    [2] => Array
            (
                [0] => 新会区松业办公家具有限公司
                [1] => 天之健办公家具展览有限公司
                [2] => 次渠龙鑫美办公家具厂
                [3] => 盛通达办公设备商行
                [4] => 历城区日超办公用品厂
                [5] => 武进区横林强力办公设备厂
                [6] => 中泰龙办公用品有限公司
                [7] => 奇龙办公设备有限公司
                [8] => 名派办公家具制造有限公司
                [9] => 中融信达办公设备商行
                [10] => 鑫惠办公设备有限公司
                [11] => 爱德天办公家具制造有限公司
                [12] => 天之健办公家具有限公司
                [13] => 华惠办公家具有限公司
                [14] => 台江区夏威办公设备经营部
                [15] => 一铭办公家具有限公司
            ))