/** * 通用关键字高亮替换 * @param {String} value 要高亮的字符串 * @param {String|Array} oldChar 要被替换的字符串(或数组) * @param {String|Array} newChar 要替换成的字符串(或数组) * * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` 高亮 * 则此时 value -> `剑鱼标讯工具函数` * oldChar -> `工具` * newChar -> `工具` * * 批量高亮----- * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` `剑鱼` 高亮 * 则此时 value -> `剑鱼标讯工具函数`批量高亮 * oldChar -> ['工具', '剑鱼'] * newChar -> ['', ''] * * 注意:此时newChar为一个长度为2的数组,数组中为高亮标签的起始标签和结束标签 * */ export function replaceKeyword( value, oldChar, newChar = ['', ''] ) { if (!oldChar || !newChar) return value // oldChar的字符串数组 let oldCharArr = [] if (Array.isArray(oldChar)) { oldCharArr = oldChar.concat() } else { oldCharArr.push(oldChar) } // 数组去重 oldCharArr = Array.from(new Set(oldCharArr)) for (let i = 0; i < oldCharArr.length; i++) { if (!oldCharArr[i]) { continue } else { oldCharArr[i] = oldCharArr[i] .replace(/([$()*+.[\]?/\\^{}|])/g, '\\$1') .replace(/\s+/g, '') } } // 数组去空 const lastArr = oldCharArr .filter((item) => !!item) .sort((a, b) => b.length - a.length) const regExp = new RegExp(`(${lastArr.join('|')})`, 'gmi') if (lastArr.length === 0) { return value } if (Array.isArray(newChar)) { // 批量高亮 return value.replace(regExp, newChar.join('$1')) } else { // 普通单个高亮 return value.replace(regExp, newChar) } }