PHP敏感信息脱敏提供五种方案:一用substr截取首尾+星号替换中间;二用preg_replace正则匹配替换;三封装通用mask_string函数支持可变参数;四结合ctype_digit校验纯数字;五用mb_substr兼容UTF-8多字节环境。

当PHP应用程序需要在前端展示用户敏感信息(如手机号、身份证号)时,直接输出完整号码存在隐私泄露风险。以下是实现手机号与身份证号中间位数隐藏的多种自定义函数方案:
一、使用str_replace配合substr构造脱敏字符串
该方法通过截取原始字符串首尾固定长度部分,并用星号替换中间字符,适用于长度确定且格式规范的字段。
1、定义手机号脱敏函数:接收11位手机号字符串,保留前3位和后4位,中间4位替换为“****”。
2、定义身份证脱敏函数:接收18位身份证号字符串,保留前6位和后4位,中间8位替换为“********”。
3、调用substr($id, 0, 6)获取前六位,substr($id, -4)获取末四位,拼接中间八个星号完成脱敏。
二、利用preg_replace执行正则模式替换
该方法通过正则表达式精准匹配数字序列中的中间段落,无需预判字符串总长,对不同位数输入具备一定容错性。
1、手机号脱敏正则:/^(1[3-9]\d{2})\d{4}(\d{4})$/,替换为“$1****$2”。
2、身份证脱敏正则:/^(\d{6})\d{10}(\d{2})$/,替换为“$1********$2”。
3、使用preg_replace($pattern, $replacement, $input)对原始字符串执行一次替换操作。
三、封装通用脱敏函数支持可变参数
该方法将脱敏逻辑抽象为通用函数,通过传入起始保留位数、结尾保留位数及掩码字符,适配多种敏感字段格式。
1、定义函数mask_string($str, $start_len, $end_len, $mask_char = '*')。
2、计算需掩码长度:$mask_len = max(0, strlen($str) - $start_len - $end_len)。
3、拼接结果:substr($str, 0, $start_len) . str_repeat($mask_char, $mask_len) . substr($str, -$end_len)。
四、结合ctype_digit校验确保输入为纯数字
该方法在脱敏前增加数据类型校验,防止非数字字符串参与处理导致不可预期输出或安全绕过。
1、对手机号输入调用ctype_digit($phone)判断是否全为数字且长度为11。
2、对身份证输入先验证长度是否为15或18,再用ctype_digit(substr($id, 0, -1))跳过末位校验码检查主体数字部分。
3、若校验失败,返回null或空字符串而非原始值。
五、使用mb_substr支持多字节字符集下的中文环境兼容
该方法避免在UTF-8编码下因substr按字节截取导致中文乱码或截断错误,确保脱敏逻辑在含中文上下文环境中稳定运行。
1、设置内部编码为UTF-8:mb_internal_encoding('UTF-8')。
2、使用mb_substr($str, 0, 3, 'UTF-8')替代substr获取前三位,保证汉字与数字混合场景下位置准确。
3、掩码部分仍使用str_repeat,因星号为ASCII字符,无需多字节处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











