开发中常常遇到类似于搜索引擎一样的关键词着色,突出显示关键词比如标红, 以下只是解决问题的一两种方法, 当然方法有很多, 需要再进一步的思考
示例代码
const title = '关键词a, 关键词b, 关键词c, 其他剩余文本';// 关键词可以是以逗号分隔的字符串, 也可以是数组const keyWords = '关键词a, 关键词b';
解决方案
方案一
/*** @desc: 主要使用数组循环以及正则匹配* @params: 返回替换后的字符串*/function formateKeyWords() {// 此处判断是否为数组, 即少去一步const arr = keyWords.replace(/\s/g, '').split(',');let formtedTitle = title;arr.forEach(keyword => {if (formtedTitle.includes(keyword)) {formtedTitle = formtedTitle.replace(new RegExp(keyword, 'g'), '<span>'+keyword+'</span>');}});return formtedTitle;}
方案二
/*** @desc: 单纯使用正则匹配* @params: 返回替换后的字符串*/function formateKeyWords() {const trimKeywords = keyWords.replace(/\s+?/g, '');const r = new RegExp(trimKeywords.replace(/,/g, '|'));const r1 = new RegExp(r, 'g');const formatedTitle = title.replace(r1, match => '<span>'+ match +'</span>');return formatedTitle;}
React
在React 中使用
import React from 'react'// 无论使用哪种方法都可以, 这里使用第二种function LabelWithColor({ text, keyWords, color }) {const trimKeywords = keyWords.replace(/\s+?/g, '');const r = new RegExp(trimKeywords.replace(/,/g, '|'));const r1 = new RegExp(r, 'g');const formatedTitle = text.replace(r1, match => `<span style={{ color }}>{match}</span>`);return (<span dangerouslySetInnerHTML={{ __html: formatedTitle }} />);}
以上可以根据具体情况做些改造, 比如关键词的分隔符, 加些类型判断
