
本文介绍一种基于空格分词与模式识别的 php 实现方案,用于自动识别字符串中的电话号码和邮箱,并统一将末尾 3 位数字(或邮箱用户名/域名对应部分)替换为 "xxx",兼顾可读性与隐私保护。
本文介绍一种基于空格分词与模式识别的 php 实现方案,用于自动识别字符串中的电话号码和邮箱,并统一将末尾 3 位数字(或邮箱用户名/域名对应部分)替换为 "xxx",兼顾可读性与隐私保护。
在处理用户输入、日志脱敏或前端展示等场景中,常需对敏感信息(如手机号、固定电话、邮箱)进行局部隐藏,既保留格式可读性,又防止完整信息泄露。本教程提供一个轻量、可靠且易于扩展的 PHP 解决方案。
核心思路:分而治之 + 类型判断
不依赖复杂正则全量匹配(易漏/易误),而是先按空格将字符串切分为独立 token,再逐个判断其类型并执行相应脱敏逻辑:
- ✅ 邮箱识别:使用
filter_var($part, FILTER_VALIDATE_EMAIL)精准校验; - ✅ 电话号识别:采用启发式规则——长度 ≥6 且至少含 1 个数字(覆盖
(111)2223333、+11234567890、1-8002353551等常见变体); - ❌ 其他内容(如纯字母单词、标点、短字符串)保持原样。
邮箱脱敏规则(更安全)
不同于简单截断,本方案对邮箱执行双向掩码:
- 用户名部分(
@前):保留除末 3 位外的所有字符,后缀xxx; - 域名部分(
@后):前缀xxx,保留从第 4 位起的原始字符(如gmail.com→xxxmail.com)。
该设计避免暴露邮箱服务商(如xxx@gmail.com仍暴露gmail),提升隐私强度。
完整可运行代码
<?php function maskSensitiveData(string $input): string
{
$tokens = explode(' ', $input);
return implode(' ', array_map(function (string $token): string {
// 情况1:有效邮箱
if (filter_var($token, FILTER_VALIDATE_EMAIL)) {
[$local, $domain] = explode('@', $token, 2);
$maskedLocal = strlen($local) > 3
? substr($local, 0, -3) . 'xxx'
: 'xxx'; // 防止用户名过短(如 a@b.c)
$maskedDomain = strlen($domain) > 3
? 'xxx' . substr($domain, 3)
: 'xxx';
return $maskedLocal . '@' . $maskedDomain;
}
// 情况2:疑似电话号(长度≥6 且含数字)
if (strlen($token) >= 6 && preg_match('/\d/', $token)) {
return substr($token, 0, -3) . 'xxx';
}
// 情况3:其他内容,不处理
return $token;
}, $tokens));
}
// 测试用例
$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';
echo maskSensitiveData($input);
// 输出:(111) 222-3xxx fgbv 1112223xxx 111 222-3xxx fghgg 111-222-3xxx <a href="mailto:test@example.com">[email protected]</a> fghntyjn (111)2223xxx +11234567xxx 1-8002353xxx 123-456-7xxx -Hello! +1 - 1234567xxx
注意事项与优化建议
- ⚠️ HTML 内容需预处理:示例中
<a></a>标签未被解析为邮箱(因含 HTML 结构),若需处理内嵌邮箱,建议先用strip_tags()或 DOM 解析提取纯文本再脱敏; - ⚠️ 国际化支持:当前电话规则对国际号码(如
+44 20 7946 0018)仍适用,但若需严格区分国家码,可引入libphonenumber库增强校验; - ✅ 性能友好:
explode+array_map时间复杂度 O(n),适合千级 token 以内场景;超大文本建议流式处理; - ✅ 可扩展性强:新增规则(如身份证、银行卡)只需在
array_map回调中追加else if分支即可。
通过此方案,你可在不破坏原始语义结构的前提下,高效、可控地实现多类型敏感数据的标准化脱敏,满足 GDPR、《个人信息保护法》等合规要求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











