export function isRegExp (value) { return Object.prototype.toString.call(value) === '[object RegExp]' } /** * 通用关键字高亮替换 * @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 || oldChar === '略') return value // oldChar的字符串数组 let oldCharArr = [] if (Array.isArray(oldChar)) { oldCharArr = oldChar.concat() } else { oldCharArr.push(oldChar) } // 非字符串替换集合 const notStrReplacer = [] for (let i = 0; i < oldCharArr.length; i++) { if (!oldCharArr[i]) { continue } else { if (isRegExp(oldCharArr[i])) { // 正则直接替换 // 注意:该正则中必须包含至少一个分组匹配,分组中的内容用来替换 notStrReplacer.push(oldCharArr[i]) oldCharArr[i] = '' } else { // 字符串替换 oldCharArr[i] = oldCharArr[i].replace(/([\$\(\)\*\+\.\[\]\?\/\\\^\{\}\|])/g, '\\$1').replace(/\s+/g, '') // oldCharArr[i] = oldCharArr[i] // .replace(/([$()*+.[\]?/\\^{}|])/g, '\\$1') // .replace(/\s+/g, '') // oldCharArr[i] = oldCharArr[i].replace(/\$/g,"\\$"); // oldCharArr[i] = oldCharArr[i].replace(/\(/g,"\\("); // oldCharArr[i] = oldCharArr[i].replace(/\)/g,"\\)"); // oldCharArr[i] = oldCharArr[i].replace(/\*/g,"\\*"); // oldCharArr[i] = oldCharArr[i].replace(/\+/g,"\\+"); // oldCharArr[i] = oldCharArr[i].replace(/\./g,"\\."); // oldCharArr[i] = oldCharArr[i].replace(/\[/g,"\\["); // oldCharArr[i] = oldCharArr[i].replace(/\]/g,"\\]"); // oldCharArr[i] = oldCharArr[i].replace(/\?/g,"\\?"); // oldCharArr[i] = oldCharArr[i].replace(/\\/g,"\\"); // oldCharArr[i] = oldCharArr[i].replace(/\//g,"\\/"); // oldCharArr[i] = oldCharArr[i].replace(/\^/g,"\\^"); // oldCharArr[i] = oldCharArr[i].replace(/\{/g,"\\{"); // oldCharArr[i] = oldCharArr[i].replace(/\}/g,"\\}"); // oldCharArr[i] = oldCharArr[i].replace(/\|/g,"\\|"); } } } // 数组去空 let lastArr = oldCharArr .filter((item) => !!item) .sort((a, b) => b.length - a.length) // 数组去重 lastArr = Array.from(new Set(lastArr)) if (lastArr.length === 0 && notStrReplacer.length === 0) { return value } if (notStrReplacer.length) { for (let j = 0; j < notStrReplacer.length; j++) { // 正则替换 value = value.replace(notStrReplacer[j], newChar) } } const regExp = new RegExp(`(${lastArr.join('|')})`, 'gmi') if (Array.isArray(newChar)) { // 批量高亮 return value.replace(regExp, newChar.join('$1')) } else { // 普通单个高亮 return value.replace(regExp, newChar) } } /** * 富文本高亮专用替换,用于指定关键词包裹高亮,使用dom解析避免HTML标签被影响 * @param htmlString - String * @param keyword - String * @param richChar - String $1 */ export function replaceKeywordWithRichText ( htmlString, keyword, richChar = '$1' ) { if (!keyword || !richChar || keyword === '略') return htmlString // 创建一个临时的DOM元素来解析HTML字符串 const tempDiv = document.createElement('div') tempDiv.innerHTML = htmlString // 格式化需要替换的富文本 const richString = richChar.replace(/\$1/g, keyword) // 递归函数来遍历DOM节点并替换文本 function replaceText(node) { if (node.nodeType === Node.TEXT_NODE && node.textContent.includes(keyword)) { // 创建一个文档片段来存放替换后的富文本和剩余文本 const frag = document.createDocumentFragment() // 将文本分割为关键词前后的文本,以及替换的富文本 const parts = node.textContent.split(keyword) for (let i = 0; i < parts.length; i++) { if (i === 1) { // 关键词替换为富文本 const richTextNode = document.createElement('div') richTextNode.innerHTML = richString; frag.appendChild(richTextNode.firstChild); } else { // 其他文本正常添加 frag.appendChild(document.createTextNode(parts[i])) } } // 替换原始文本节点 node.parentNode.replaceChild(frag, node) } else if (node.nodeType === Node.ELEMENT_NODE) { // 如果是元素节点,递归其子节点 Array.from(node.childNodes).forEach(replaceText) } } // 从临时div开始递归替换文本 replaceText(tempDiv) // 返回修改后的HTML字符串 return tempDiv.innerHTML } /** * 从key=value&key1=value1&key2=value2...中获取key值 * @param {String} formString 目标字符串,必须为key=value&key1=value1的格式 * @param {String} targetKey 要从目标字符串获取哪个key * @returns {String} */ export function getFormValue(formString, targetKey) { let reg = new RegExp('(^|&)' + targetKey + '=([^&]*)(&|$)', 'i') let r = formString.match(reg) //获取url中'?'符后的字符串并正则匹配 let context = '' if (r != null) context = r[2] // 释放变量 reg = null r = null return context == null || context == '' || context == 'undefined' ? '' : context } /** * 从url中获取对应name的参数 * @param {String} name * @returns {String} */ export function getQueryParam(name) { const search = window.location.search let target = '' if (search) { const arr = search.split('?') if (arr[1]) { target = arr[1] } } const value = getFormValue(target, name) return decodeURIComponent(value) }