有问题,可以加⼊讨论 QQ:825042078
这段代码可以实现剥离出:⾝份证号,⼿机号,座机号,右边,同时出去字符⾥⾯的⼀些⼲扰词,只留下⽤于解析的详细地址然后详细地址可以,通过第⼆段程序,分离出,省+市+区+ 街道地址
<?php
/**
* 此过程不需要查询数据库,是纯PHP
*/
class Address
{
/**
* 地址智能解析
* @param string 包含丰富信息的字符串
* @return array 姓名,⼿机号,邮编,详细地址 */
public static function smart_parse($address)
{
//解析结果
$parse = [];
$parse['name'] = '';
$parse['mobile'] = '';
$parse['postcode'] = '';
$parse['idno'] = '';
短址
$parse['detail'] = '';
//1. 过滤掉收货地址中的常⽤说明字符,排除⼲扰词
$search = ['收货地址', '地址', '收货⼈', '收件⼈', '收货', '邮编', '电话', '⾝份证号码', '⾝份证号', '⾝份证', ':', ':', ';', ';', ',', ',', '。', ];
$replace = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '];
$address = str_replace($search, $replace, $address);
//2. 连续2个或多个空格替换成⼀个空格
$address = preg_replace('/ {2,}/', ' ', $address);
//3. 去除⼿机号码中的短横线如136-3333-6666 主要针对苹果⼿机
$address = preg_replace('/(\d{3})-(\d{4})-(\d{4})/', '$1$2$3', $address);
//4. 提取中国境内⾝份证号码
preg_match('/\d{18}|\d{17}X/i', $address, $match);
if ($match && $match[0]) {
$parse['idno'] = strtoupper($match[0]);
$address = str_replace($match[0], '', $address);
}
//5. 提取11位⼿机号码或者7位以上座机号
preg_match('/\d{7,11}|\d{3,4}-\d{6,8}/', $address, $match);
if ($match && $match[0]) {
$parse['mobile'] = $match[0];
$address = str_replace($match[0], '', $address);
}
//6. 提取6位邮编邮编也可⽤后⾯解析出的省市区地址从数据库匹配出
preg_match('/\d{6}/', $address, $match);
if ($match && $match[0]) {
$parse['postcode'] = $match[0];
$address = str_replace($match[0], '', $address);
}
//再次把2个及其以上的空格合并成⼀个,并⾸位TRIM
$address = trim(preg_replace('/ {2,}/', ' ', $address));
//按照空格切分长度长的为地址短的为姓名因为不是基于⾃然语⾔分析,所以采取统计学上⾼概率的⽅案
$split_arr = explode(' ', $address);
if (count($split_arr) > 1) {
$parse['name'] = $split_arr[0];
foreach ($split_arr as $value) {
if (strlen($value) < strlen($parse['name'])) {
$parse['name'] = $value;
}
}
$address = trim(str_replace($parse['name'], '', $address));
}
$parse['detail'] = $address;
//parse['detail']详细地址可以传⼊另⼀个⽂件的函数,⽤来解析出:省,市,区,街道地址
var_dump($parse);
}
}
$obj = Address::smart_parse('⾝份证号:512501************ 收货地址张三收货地址:成都市武侯区美领馆路11号附2号 617000 136-3333-6666 ');
//上⾯例⼦会解析出结果:
array(5) {
["name"]=>
string(6) "张三"
["mobile"]=>
string(11) "136********"
["postcode"]=>
string(6) "617000"
["idno"]=>
string(18) "512501************"
["detail"]=>
string(33) "成都市武侯区美领馆路11号附2号"
}
分离省市区和街道地址的代码如下
因为分离过过程中需要,跟中国现在⾏政区的地址⽐较,所以会有⼀个记录全国省市区的数据库
有问题,可以加⼊讨论 QQ:825042078