Live2d Test Env

文本加密

/**
 * 替换字符串中指定前缀和后缀之间的内容为 *
 * @param str - 要进行替换的字符串
 * @param options - 替换选项对象,包含前缀和后缀,默认为 { prefix: "关于", suffix: "纪要" }
 * @param options.prefix - 前缀,默认为 "关于"
 * @param options.suffix - 后缀,默认为 "纪要"
 * @returns 替换后的字符串
 */
export function replaceBetween(
  str: string,
  options: { prefix?: string; suffix?: string } = { prefix: '关于', suffix: '纪要' }
): string {
  const { prefix = '关于', suffix = '纪要' } = options
  const regex = new RegExp(`${prefix}(.*?)${suffix}`)
  const match = regex.exec(str)
  if (match) {
    const replaceStr = match[1].replace(/./g, '*')
    return str.replace(regex, `${prefix}${replaceStr}${suffix}`)
  } else {
    return str
  }
}

// 普通人名,去除两边空格  strList:string=>arr []=>str string
export function replaceName(nameStr: string) {
  if (!nameStr) return `*`
  const nameList = nameStr.split(',')
  // console.log('nameList :>> ', nameList)
  const _replaceChars = (str: string) => {
    if (str.length === 2) {
      return str[0] + '*'
    } else if (str.length === 3) {
      return str[0] + '*' + '*'
    } else {
      return str[0] + '*'.repeat(str.length - 1)
    }
  }
  return nameList.map((v: string) => _replaceChars(v.trim())).join()
}
// 暴力加密: 长度为2则最后一位为*,大于2则仅保留头尾中间全部为*  究极大招

export function encryptStr(nameStr: string) {
  if (nameStr.length === 1) return nameStr
  if (nameStr.length === 2) return nameStr[0] + '*'
  return nameStr[0] + '*'.repeat(nameStr.length - 2) + nameStr[nameStr.length - 1]
}

/**
 * 将文本中特定关键词前面的指定数量的字符替换为指定的字符串。
 * @param text - 待处理的文本。
 * @param options - 选项对象,包括 keyword、replaceCount 和 replacement 字段。
 *      mismatchList: 当文本不符合keyword,但是又须将指定词替换为*时使用,如:将`福州`两字替换为**
 * @param isNeedMismatchList - 是否确认mismatchList默认true,若为false,则当文本不符keyword会原文输出
 * @returns 处理后的文本。
 */
export function replacePrefix(
  text: string,
  options?: {
    keyword?: string
    replaceCount?: number
    replacement?: string
    mismatchList?: string[]
  },
  isNeedMismatchList: boolean = true
): string {
  // 默认选项
  const defaultOptions = {
    keyword: '(省|市|县|区|同志|任期|乡|镇|村|及|街道)',
    replaceCount: 2,
    replacement: '*',
    mismatchList: ['福州']
  }
  // 合并选项
  const { keyword, replaceCount, replacement, mismatchList } = { ...defaultOptions, ...options }
  let resultStr = text

  // 构造正则表达式模式
  const pattern = new RegExp(`(.{${replaceCount}})(${keyword})(?:(?!\\2).)*?`, 'g')

  if (pattern.test(text)) {
    // 替换匹配的部分
    const replacedText = resultStr.replace(pattern, (match, p1, p2) => {
      return replacement.repeat(replaceCount) + p2
    })
    resultStr = replacedText
  }
  // 如果文本中不存在匹配模式,
  // 如果文本中有`福州`,则替换为**
  // 否则直接返回原始文本
  if (!mismatchList.includes(resultStr) && isNeedMismatchList) {
    //有匹配词
    const regex = new RegExp(mismatchList.join('|'), 'g')
    let match
    while ((match = regex.exec(resultStr)) !== null) {
      const stars = replacement.repeat(match[0].length)
      resultStr = resultStr.replace(match[0], stars)
    }
    return resultStr
  }
  return resultStr
}

以上。

posted @ 2025-03-03 14:45  致爱丽丝  阅读(14)  评论(0)    收藏  举报