
本文介绍一种基于空格分词、正则识别和字符串截取的 php 实现方案,可自动将字符串中所有手机号末三位及邮箱用户名末三位、域名前三位统一替换为 "xxx",兼顾可读性与隐私保护。
本文介绍一种基于空格分词、正则识别和字符串截取的 php 实现方案,可自动将字符串中所有手机号末三位及邮箱用户名末三位、域名前三位统一替换为 "xxx",兼顾可读性与隐私保护。
在处理用户输入或日志数据时,常需对敏感信息(如电话号码、邮箱地址)进行脱敏展示——既保留格式可读性,又防止隐私泄露。本教程提供一个轻量、可靠且易于扩展的 PHP 解决方案,适用于混合文本中嵌入的多格式联系方式(如 (111) 222-3333、1112223333、+11234567890、user@example.com 等)。
核心思路是:按空格切分字符串 → 逐段识别类型 → 分别脱敏 → 重新拼接。该策略避免了复杂正则全量匹配可能引发的误伤(如把 123-abc-456 当作号码),同时保持逻辑清晰、调试友好。
✅ 脱敏规则定义
-
邮箱地址(通过
filter_var($part, FILTER_VALIDATE_EMAIL)验证):- 用户名部分(
@前)保留前缀,末 3 位替换为xxx; - 域名部分(
@后)前 3 位替换为xxx,其余保留(例如hello@world.com→helxxx@xxxld.com)。
- 用户名部分(
-
疑似电话号码(长度 ≥ 6 且含至少一个数字):
- 统一截取末 3 位,替换为
xxx(如123-456-7890→123-456-7xxx,+11234567890→+11234567xxx)。
- 统一截取末 3 位,替换为
- 其他内容(纯字母、符号、短字符串等):原样保留。
? 完整实现代码
<?php function maskSensitiveParts(string $input): string
{
$parts = explode(' ', $input);
return implode(' ', array_map(function (string $part): string {
// 情况 1:合法邮箱地址
if (filter_var($part, FILTER_VALIDATE_EMAIL)) {
[$local, $domain] = explode('@', $part, 2);
$local = strlen($local) > 3 ? substr($local, 0, -3) . 'xxx' : 'xxx';
$domain = strlen($domain) > 3 ? 'xxx' . substr($domain, 3) : 'xxx';
return $local . '@' . $domain;
}
// 情况 2:长度 ≥6 且含数字 → 视为电话类字段
if (strlen($part) >= 6 && preg_match('/\d/', $part)) {
return substr($part, 0, -3) . 'xxx';
}
// 其他情况:不处理
return $part;
}, $parts));
}
// 示例用法
$input = '(111) 222-3333 fgbv 1112223333 111 222-3333 fghgg 111-222-3333 <a href="mailto:test@example.com">[email protected]</a> fghntyjn (111)2223333 +11234567890 1-8002353551 123-456-7890 -Hello! +1 - 1234567890';
$output = maskSensitiveParts($input);
echo $output;
// 输出示例:"(111) 222-3xxx fgbv 1112223xxx 111 222-3xxx fghgg 111-222-3xxx <a href="%5C%22mailto:test@example.com%5C%22">[email protected]</a> fghntyjn (111)2223xxx +11234567xxx 1-8002353xxx 123-456-7xxx -Hello! +1 - 1234567xxx"
⚠️ 注意事项与增强建议
-
邮箱验证局限性:
FILTER_VALIDATE_EMAIL不校验 DNS 或 MX 记录,但足以过滤绝大多数非邮箱字符串;若需更高精度,可结合更严格的正则(如^[^\s@]+@[^\s@]+\.[^\s@]+$)预筛。 -
HTML 标签内邮箱:当前逻辑仅处理独立单词。若邮箱嵌套在
<a></a>标签中(如示例中的href="mailto:..."或data-cfemail),需先用 DOM 解析或正则提取再处理,不可直接对整个 HTML 片段调用本函数。 -
国际化支持:本方案默认适配常见北美/国际格式;如需支持中文区号(如
+86 138 1234 5678),建议先归一化(移除空格、括号、短横线)再判断数字长度。 -
性能提示:对超长文本(>10MB),建议改用流式处理或正则全局替换(如
preg_replace_callback),避免内存爆炸。
此方法平衡了准确性、可维护性与执行效率,可作为通用脱敏工具集成至日志系统、客服工单或前端预览模块中。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











