身份证,手机号,姓名 脱敏格式化处理

<?php

class Mask
{
    const CARD = 1;     //身份证
    const PHONE = 2;    //手机号
    const NAME = 3;     //姓名

    /**
     * Notes: 脱敏格式化字符串
     * @param string $str 需要脱敏字符
     * @param $type 内容类型
     * @return mixed|string
     */
    private function formatData($str, $type)
    {
        $res = '';
        if (empty($str) || empty($type)) {
            return $res;
        }

        $len = strlen($str);
        switch ($type) {
            case self::CARD:
                $res = substr_replace($str, str_repeat('*', ($len - 8)), 6, $len - 8);
                break;
            case self::PHONE:
                $res = substr_replace($str, str_repeat('*', ($len - 7)), 7, $len - 7);
                break;
            case self::NAME:
                $res = $this->formatName($str);
                break;
            default :
                $res = $str;
                break;
        }
        return $res;
    }

    /**
     * Notes: 批量脱敏格式化数据
     * @param array $data 格式化字符数组
     * @param $type 内容类型
     * @return array|mixed
     */
    private function bacthFormatData($data, $type)
    {
        $ret = [];
        if (empty($data) || !is_array($data) || empty($type)) {
            return $ret;
        }

        switch ($type) {
            case self::CARD :
                foreach ($data as $item){
                    $len = strlen($item);
                    $ret[$item] = substr_replace($item, str_repeat('*', ($len - 8)), 6, $len - 8);
                }
                break;
            case self::PHONE :
                foreach ($data as $item) {
                    $len = strlen($item);
                    $ret[$item] = substr_replace($item, str_repeat('*', ($len - 7)), 3, $len - 7);
                }
                break;
            case self::NAME :
                foreach ($data as $item) {
                    $ret[$item] = $this->formatName($item);
                }
                break;
            default :
                $ret = $data;
                break;
        }
        return $ret;
    }


    /**
     * Notes:脱敏格式化名称
     * @param $str 需要脱敏字符
     * @return mixed|string
     */
    private function formatName($str)
    {
        $res = '';
        if (empty($str)) {
            return $res;
        }

        $len = mb_strlen($str);
        $res = $str;
        if ($len == 2){
            $res = $this->stringTrim($res, '*', 0, 1);
        } elseif ($len == 3) {
            $res = $this->stringTrim($res, '*', 0, 1, 1, 1);
        } elseif ($len > 3 && $len <= 6) {
            $res = $this->stringTrim($res, '*', 0, 1, 2, 2);
        } elseif ($len > 6) {
            $res = $this->stringTrim($res, '*', 0, 2, 3, 3);
        }
        return $res;
    }


    /**
     * Notes:中文脱敏替换
     * @param $str 脱敏字符
     * @param string $replace 替换字符
     * @param int $start 头部位置
     * @param int $startLen 头部替换长度
     * @param int $end 尾部位置
     * @param int $endLen 尾部替换长度
     * @return string
     */
    private function stringTrim($str, $replace = '*', $start = 0, $startLen = 0, $end = 0, $endLen = 0)
    {
        $str = mb_substr($str, $start, $startLen) . str_repeat($replace, (mb_strlen($str) - ($startLen + $endLen))) .mb_substr($str, -$end, $endLen);
        return $str;
    }


    /**
     * Notes:数据脱敏格式化
     * @param array|string $datas 需要格式化的数据内容
     * @param int $type 内容类型 1:身份证,2:手机号,3:姓名
     * @return array|mixed|string|string[]
     */
    public function dataMark($datas, $type = self::NAME)
    {
        if (!is_array($datas)) {
            return $this->formatData($datas, $type);
        }
        return $this->bacthFormatData($datas, $type);
    }

}


//调用测试demo
$mask = new Mask();
$name = '我是中文名称';
$card = '333333333333333333';
$phone = '15012345678';

$names = ['我是中文名称1', '我是中文名称2'];
$cards = ['333333333333333333', '222222222222222222'];
$phones = ['15012345678', '13012345678'];

echo "<pre>";

echo $mask->dataMark($card, 1)."</br>";
echo $mask->dataMark($phone, 2)."</br>";
echo $mask->dataMark($name, 3)."</br>";

print_r($mask->dataMark($cards, 1));
print_r($mask->dataMark($phones, 2));
print_r($mask->dataMark($names, 3));

echo "</pre>";





结果展示

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值