字符串脱敏核心是保留首尾关键位、中间用星号替换:手机号取前3后4位,身份证按前6后4位并动态计算掩码长度,邮箱保留用户名首尾及域名,通用函数支持自定义头尾长度与掩码符。

对字符串做简单脱敏,常见于手机号、身份证号、邮箱等敏感信息展示场景。核心思路是:保留关键标识位(如首尾几位),中间用星号 * 或其他符号替代,长度可控、逻辑清晰、不依赖扩展。
手机号脱敏(11位)
国内手机号固定11位,通常保留前3位和后4位,中间4位替换为 ****。
- 用 substr() 截取:`substr($phone, 0, 3) . '****' . substr($phone, -4)`
- 加基础校验更稳妥:`if (strlen($phone) === 11 && ctype_digit($phone))`
- 注意:避免直接对空值或非数字字符串操作,可先 `trim()` 并判断非空
身份证号脱敏(15或18位)
兼顾兼容性,统一按“保留前6位 + **** + 后4位”处理,既体现归属地,又隐藏主体信息。
- 推荐写法:substr($id, 0, 6) . str_repeat('*', strlen($id) - 10) . substr($id, -4)
- 自动适配15/18位:`strlen($id) - 10` 得到中间需掩码的位数(15→5星,18→8星)
- 若只要固定显示8个星号(如 110101********1234),可直接拼接:`substr($id, 0, 6) . '********' . substr($id, -4)`
邮箱地址脱敏
保留用户名首尾字符和域名,隐藏中间部分。例如 zhang***@163.com。
- 先用 strpos() 找 @ 位置,再分段处理
- 示例:$at = strpos($email, '@');
substr($email, 0, 1) . '***' . substr($email, $at) - 更严谨可限制用户名长度≥3:`$userLen = $at; if ($userLen > 3) { ... }`
通用脱敏函数(可复用)
封装一个灵活函数,支持任意字符串、保留头尾位数、自定义掩码符:
- function maskString($str, $head = 2, $tail = 2, $mask = '*') {
$len = strlen($str);
if ($len return substr($str, 0, $head) . str_repeat($mask, $len - $head - $tail) . substr($str, -$tail);
} - 调用示例:
maskString('13812345678', 3, 4)→ 138****5678 - 适用于姓名(张***丰)、银行卡(6228****1234)等场景,只需调整参数
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











