敏感词
This commit is contained in:
1 parent
6396ccc701
commit
f472bba9f0
38 files changed
+540
-173
No files matched your search
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* 脱敏词映射表
|
||||
* key: 原始词(支持正则特殊字符,会被转义)
|
||||
* value: 脱敏后替换词
|
||||
*/
|
||||
export const DESENSITIZE_MAP: Record<string, string> = {
|
||||
态势: "TS",
|
||||
情报: "QB",
|
||||
指挥: "ZH",
|
||||
信息准备: "XX准备",
|
||||
行为体: "XWT",
|
||||
驱动因素: "QDYS",
|
||||
叙事: "XS",
|
||||
前三定: "QSD",
|
||||
受众目标: "SZMB",
|
||||
作战: "ZZ",
|
||||
目的: "MD",
|
||||
关键传播节点: "GJCBJD",
|
||||
战法: "ZF",
|
||||
行动: "XD",
|
||||
打击: "DJ",
|
||||
目标: "MB",
|
||||
战力: "ZL",
|
||||
筹划: "COH",
|
||||
策划: "CEH",
|
||||
模拟: "MN",
|
||||
推演: "TY",
|
||||
认知: "RZ",
|
||||
触及: "CJ"
|
||||
};
|
||||
|
||||
/**
|
||||
* 将 DESENSITIZE_MAP 编译为单个正则,避免多次遍历字符串。
|
||||
* 仅在模块首次加载时执行一次。
|
||||
*/
|
||||
function buildRegex(map: Record<string, string>): RegExp | null {
|
||||
const keys = Object.keys(map);
|
||||
if (keys.length === 0) return null;
|
||||
const pattern = keys.map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
||||
return new RegExp(pattern, "g");
|
||||
}
|
||||
|
||||
let _regex: RegExp | null = buildRegex(DESENSITIZE_MAP);
|
||||
|
||||
/**
|
||||
* 对文本进行脱敏处理,将 DESENSITIZE_MAP 中的词替换为对应脱敏词。
|
||||
*
|
||||
* @param text 原始文本
|
||||
* @returns 脱敏后的文本
|
||||
*
|
||||
* @example
|
||||
* desensitize("当前态势分析") // => "当前TS分析"
|
||||
*/
|
||||
export function desensitize(text: string): string {
|
||||
if (!_regex) return text;
|
||||
// 每次 exec 需要重置 lastIndex,使用 replace 更安全
|
||||
return text.replace(_regex, (matched) => DESENSITIZE_MAP[matched] ?? matched);
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行时动态追加脱敏词,追加后自动重编译正则。
|
||||
*
|
||||
* @param entries 要追加的词条,格式同 DESENSITIZE_MAP
|
||||
*
|
||||
* @example
|
||||
* addDesensitizeEntries({ 情报: "QB", 指挥: "ZH" });
|
||||
*/
|
||||
export function addDesensitizeEntries(entries: Record<string, string>): void {
|
||||
Object.assign(DESENSITIZE_MAP, entries);
|
||||
_regex = buildRegex(DESENSITIZE_MAP);
|
||||
}
|
||||
Reference in new issue
Block a user