
本文介绍一种基于空格分词与规则匹配的 PHP 实现方案,可自动识别字符串中的电话号码和邮箱地址,并将各自末尾 3 位数字(邮箱用户名末 3 位 + 域名首 3 位)替换为 xxx,兼顾可读性与隐私保护。
本文介绍一种基于空格分词与规则匹配的 php 实现方案,可自动识别字符串中的电话号码和邮箱地址,并将各自末尾 3 位数字(邮箱用户名末 3 位 + 域名首 3 位)替换为 `xxx`,兼顾可读性与隐私保护。
在处理用户输入、日志脱敏或前端展示等场景中,常需对字符串中嵌入的敏感信息(如电话号码、邮箱)进行局部掩码,而非完全移除——既要保留格式可读性,又要防止隐私泄露。本教程提供一个轻量、可扩展的 PHP 解决方案,核心思路是:按空格切分字符串 → 逐段识别类型 → 分类掩码 → 重组输出。
✅ 处理逻辑说明
-
邮箱识别:使用
filter_var($part, FILTER_VALIDATE_EMAIL)精确判断是否为合法邮箱;- 用户名部分(
@前)保留前缀,末尾 3 字符替换为xxx; - 域名部分(
@后)前 3 字符替换为xxx,其余保留(如example.com→xxxmple.com);
- 用户名部分(
-
电话号码识别:满足
长度 ≥ 6 且含至少 1 个数字的片段视为待掩码号码(覆盖(111)2223333、123-456-7890、+11234567890等常见格式);- 统一执行
substr($part, 0, -3) . 'xxx',即仅隐藏最后 3 位数字;
- 统一执行
- 非敏感内容(如纯字母单词、标点、混合文本)保持原样。
? 完整可运行代码
<?php
function maskSensitiveParts(string $input): string
{
$parts = explode(' ', $input);
return implode(' ', array_map(function (string $part): string {
// 邮箱:精确验证 + 分段掩码
if (filter_var($part, FILTER_VALIDATE_EMAIL)) {
[$local, $domain] = explode('@', $part, 2);
$local = strlen($local) > 3 ? substr($local, 0, -3) . 'xxx' : str_repeat('x', strlen($local));
$domain = strlen($domain) > 3 ? 'xxx' . substr($domain, 3) : str_repeat('x', strlen($domain));
return $local . '@' . $domain;
}
// 电话类:长度≥6 且含数字 → 掩码末3位
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';
echo maskSensitiveParts($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 解析器提取纯文本,再统一掩码; -
边界情况:短邮箱(如
a@b.co)或超短号码(如123)默认跳过掩码,避免破坏结构; -
正则增强版:若需更高精度识别(如排除
abc123这类伪号码),可改用电话正则(如/^[\+\(\)\-\s\d]{7,}$/)替代简单长度判断; -
国际化支持:当前方案对
+1-800-XXX-XXXX类格式有效,但复杂国际号码建议接入专用库(如libphonenumber)。
该方案简洁高效,无需依赖外部组件,适合快速集成到日志脱敏、客服工单、用户资料预览等中低安全要求场景。如需更高安全性(如符合 GDPR/CCPA),建议结合服务端加密与字段级权限控制。



















