Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 13x 13x 95x 13x 13x 14x 13x 13x 7x 4x 3x 1x 2x 1x 1x 1x 6x 5x 1x | export enum DesensitizeStrategy {
CHINESE_NAME = 'CHINESE_NAME',
CHINESE_ID_CARD_NUMBER = 'CHINESE_ID_CARD_NUMBER',
CHINESE_MOBILE_PHONE_NUMBER = 'CHINESE_MOBILE_PHONE_NUMBER',
EMAIL = 'EMAIL',
}
export interface DesensitizeOptions {
/**
* 脱敏策略
*/
strategy?: DesensitizeStrategy
/**
* 脱敏替换字符
*
* @default '*'
*/
replacer?: string
/**
* 前置保留字符数
*
* @default 0
*/
preKeep?: number
/**
* 后置保留字符数
*
* @default 0
*/
postKeep?: number
}
function replace(text: string, start: number, end: number, replacer: string) {
let res = text.substring(0, start)
for (let i = start; i < end; i++) {
res += replacer
}
res += text.substring(end)
return res
}
/**
* 文本脱敏。
*
* @param text 待脱敏的文本
* @param options 脱敏选项
*/
export function desensitize(
text: string,
options: DesensitizeOptions = {},
): string {
if (!text) return text
const replacer = options?.replacer ?? '*'
if (options.strategy) {
if (options.strategy === DesensitizeStrategy.CHINESE_NAME) {
return replace(text, 1, text.length, replacer)
}
if (options.strategy === DesensitizeStrategy.CHINESE_ID_CARD_NUMBER) {
return replace(text, 1, text.length - 2, replacer)
}
if (options.strategy === DesensitizeStrategy.CHINESE_MOBILE_PHONE_NUMBER) {
return replace(text, 3, text.length - 4, replacer)
}
if (options.strategy === DesensitizeStrategy.EMAIL) {
return replace(text, 1, text.indexOf('@'), replacer)
}
}
if (options.preKeep != null || options.postKeep != null) {
return replace(
text,
options.preKeep ?? 0,
text.length - (options.postKeep ?? 0),
replacer,
)
}
return replace(text, 0, text.length, replacer)
}
|