str.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * 通用关键字高亮替换
  3. * @param {String} value 要高亮的字符串
  4. * @param {String|Array} oldChar 要被替换的字符串(或数组)
  5. * @param {String|Array} newChar 要替换成的字符串(或数组)
  6. *
  7. * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` 高亮
  8. * 则此时 value -> `剑鱼标讯工具函数`
  9. * oldChar -> `工具`
  10. * newChar -> `<span class="highlight-text">工具</span>`
  11. *
  12. * 批量高亮-----
  13. * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` `剑鱼` 高亮
  14. * 则此时 value -> `剑鱼标讯工具函数`批量高亮
  15. * oldChar -> ['工具', '剑鱼']
  16. * newChar -> ['<span class="highlight-text">', '</span>']
  17. *
  18. * 注意:此时newChar为一个长度为2的数组,数组中为高亮标签的起始标签和结束标签
  19. *
  20. */
  21. export function replaceKeyword(
  22. value,
  23. oldChar,
  24. newChar = ['<span class="highlight-text">', '</span>']
  25. ) {
  26. if (!oldChar || !newChar) return value
  27. // oldChar的字符串数组
  28. let oldCharArr = []
  29. if (Array.isArray(oldChar)) {
  30. oldCharArr = oldChar.concat()
  31. } else {
  32. oldCharArr.push(oldChar)
  33. }
  34. // 数组去重
  35. oldCharArr = Array.from(new Set(oldCharArr))
  36. for (let i = 0; i < oldCharArr.length; i++) {
  37. if (!oldCharArr[i]) {
  38. continue
  39. } else {
  40. oldCharArr[i] = oldCharArr[i]
  41. .replace(/([$()*+.[\]?/\\^{}|])/g, '\\$1')
  42. .replace(/\s+/g, '')
  43. }
  44. }
  45. // 数组去空
  46. const lastArr = oldCharArr
  47. .filter((item) => !!item)
  48. .sort((a, b) => b.length - a.length)
  49. const regExp = new RegExp(`(${lastArr.join('|')})`, 'gmi')
  50. if (lastArr.length === 0) {
  51. return value
  52. }
  53. if (Array.isArray(newChar)) {
  54. // 批量高亮
  55. return value.replace(regExp, newChar.join('$1'))
  56. } else {
  57. // 普通单个高亮
  58. return value.replace(regExp, newChar)
  59. }
  60. }