通用文字脱敏函数 支持vue3 vue2 react ts
该代码实现了一个通用文字脱敏函数,支持手机号、身份证、姓名、邮箱等常见类型的自动脱敏处理,也允许自定义脱敏规则。函数接收三个参数:原始文本、脱敏类型(默认custom)和自定义选项(保留前后字符数及掩码字符)。通过正则表达式匹配实现不同格式的脱敏,如手机号显示前3后4位(138**5678),姓名保留首尾字符(张或王明)。自定义类型可按需设置保留字符数和掩码符号,适用于各种敏感信息保护场景。
·
/**
* 通用文字脱敏函数
* @param value 原始文本
* @param type 脱敏类型 (phone | idCard | name | email | custom)
* @param options 自定义规则 { keepStart, keepEnd, mask }
*/
export function desensitize(
value: string,
type: "phone" | "idCard" | "name" | "email" | "custom" = "custom",
options?: { keepStart?: number; keepEnd?: number; mask?: string }
): string {
if (!value) return "";
const maskChar = options?.mask ?? "*";
switch (type) {
case "phone": // 手机号 138****5678
return value.replace(/^(\d{3})\d{4}(\d{4})$/, `$1${maskChar.repeat(4)}$2`);
case "idCard": // 身份证 440***********1234
return value.replace(/^(\d{4})\d{10}(\w{4})$/, `$1${maskChar.repeat(10)}$2`);
case "name": // 姓名 张三 -> 张* ; 王小明 -> 王*明
if (value.length <= 2) {
return value[0] + maskChar;
} else {
return value[0] + maskChar.repeat(value.length - 2) + value[value.length - 1];
}
case "email": // 邮箱 abc****@qq.com
return value.replace(/^(.{2}).*(@.*)$/, `$1${maskChar.repeat(4)}$2`);
case "custom": // 自定义规则
const keepStart = options?.keepStart ?? 1;
const keepEnd = options?.keepEnd ?? 1;
if (value.length <= keepStart + keepEnd) return maskChar.repeat(value.length);
return (
value.slice(0, keepStart) +
maskChar.repeat(value.length - keepStart - keepEnd) +
value.slice(value.length - keepEnd)
);
default:
return value;
}
}
使用
参数1:原始文本
参数2: 脱敏类型
参数3 自定义规则
desensitize(“18888888888”,‘phone’) 输出 138*****8888
更多推荐
所有评论(0)