复杂的地址省份城市正则提取 本帖最后由 wenwen16396 于 2011-03-06 11:09:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的话将你的预定义表导入数组,用preg_replace甚至str_replace(写得好的话后者运行更快)替换就可以了但实际上这里涉及汉语的理解问题,不是电脑能完全完成的,例如“新市”怎样理解?如果仅仅出现“吉林”应该理解为“吉林省”还是“吉林市”?少数民族地区的地名可能更多歧义 可以不可以根据表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语言该如何操作呢? 一个简单粗糙的做法。对于自治区和黑龙江无法匹配,得要继续修改代码。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"; } } }} 预期说是正则匹配,到不如说是寻找的内容(公司所在地)与城市数据字典如何匹配,那就要分析数据字典里面有多少特殊情况,除了特殊情况之外的匹配是一个什么规则(直辖市的问题、带不带"市"、字数问题等),特殊情况则要特殊对待(例如吉林的问题)程序逻辑描述如下<?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;}未经任何测试 只是一个大概思路 life169,你好!能介绍一下这个正则表达式吗?'/(.{4}).*\n/i'我测式的时候,这个正则表达式不成立,不能匹配到省份或城市 我用的是gbk编码 而你用的是utf-8编码utf8是3字节 gbk是2字节当然不能匹配了 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"; } } }}?> 处理时用 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] => 一铭办公家具有限公司 )) php session 问题 如何建立mysql时间戳字段 寻找兼职PHP程序员共通创业。 任何用cookie实现这样的功能? 安装PHP论坛的抉择,我免费提供几个测试点,供大家免费测评! 如何比较他们相等呢? 请求帮助PHP使用mkdir函数创建目录--求脆各位大侠! "/:(^[a-zA-Z]+\w{0,14}):/"为何不能匹配;开头和结尾、中间是字母开头的内容包含下划线数字的字符串? php有关问题! redhat下php连接mysql,命令行下没问题,网页出错。 求助有关数据库查询语句的问题 浏览器编码问题,急!
对于自治区和黑龙江无法匹配,得要继续修改代码。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";
}
}
}
}
<?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;
}
未经任何测试 只是一个大概思路
能介绍一下这个正则表达式吗?'/(.{4}).*\n/i'我测式的时候,这个正则表达式不成立,不能匹配到省份或城市
我用的是gbk编码 而你用的是utf-8编码
utf8是3字节 gbk是2字节
当然不能匹配了
$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";
}
}
}
}?>
$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] => 一铭办公家具有限公司
))