不败君

前端萌新&初级后端攻城狮

PHP处理字符串隐私保护

PHP处理字符串隐私保护

2020-04-17 18:12:06

围观(3549)

今天遇到个需求, 就是从数据库取出的数据, 好几个字段都需要做隐私保护.

如一个表, 有真实姓名 / 身份证号 / 电话号 / 微信号 / 邮箱 等等 都需要处理隐私保护.

如手机号处理后: 136****0000 邮箱: 12**56@qq.com

本想着应该会有挺多这种轮子的, 但是随便搜了一下之后发现, 好多都是简单的取了字符串开头几个和结尾几个, 中间就用 * 替换掉而已. 这种并不能通用.

比如邮箱取首尾去除中间, 那邮箱的域名都没了...


因为这个特殊需求, 写了一段处理字符串隐私的:

function hidden_string($string)
{
    $at_location = mb_strpos($string, '@');
    if ($at_location) {
        $email_domain = mb_substr($string, $at_location);
        $string = mb_substr($string, 0, $at_location);
    }

    $string_length = mb_strlen($string);
    $segment = round($string_length / 3);
    $start_string = mb_substr($string, 0, $segment);

    $hidden = '';
    for ($i = 0; $i < $segment; $i++) { 
        $hidden .= '*';
    }

    $start_length = mb_strlen($start_string . $hidden);

    $end_string = mb_substr($string, $start_length);

    if (isset($email_domain)) {
        return $start_string . $hidden . $end_string . $email_domain;
    }
    return $start_string . $hidden . $end_string;
}

echo hidden_string(13622222222);
// 1362****222

echo hidden_string(440111111111111111);
// 440111******111111

echo hidden_string('123456@qq.com');
// 12**56@qq.com

echo hidden_string('123456789@qq.com');
// 123***789@qq.com

echo hidden_string('这是一段内容');
// 这是**内容

这段代码虽然能实现大部分需求, 但是手机号处理和身份证处理还是不完美的.

手机号处理更应该是显示前三位和后面四位, 身份证隐藏了中间一段出生年和月, 如果知道对方出生 那身份证号也暴露了.

代码还可以继续优化, 正则应该也能处理, 但是.. 又不是不能用.

本文地址 : bubaijun.com/page.php?id=172

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语