php 解析 提取 收货人 地址 电话

实现思路:

  • 去除字符串中的干扰项
  • 正则匹配(这里需要了解正则知识点)
  • 匹配出:邮政编码地址身份证号手机号座机号收件人收货人

php代码实例说明

  • 以下代码是纯php实现,没有依赖数据库,第三方接口等,也不依赖任何扩展类
  • 兼容任何php版本
<?php
$address = "身份证号:13012519910927226x  收货人吴彦祖收货地址:河北省石家庄市长安区中山东路888号万达广场1001  050000  13211006666";
$address = "河北省石家庄,收货人:吴彦祖;电话:15620209999";
$addressArr = getDetail($address);
echo '<pre>';
print_r($addressArr);

function getDetail(string $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;
    return	$parse;
}

猜你喜欢

转载自blog.csdn.net/jackbon8/article/details/107958832