开发中常常遇到类似于搜索引擎一样的关键词着色,突出显示关键词比如标红, 以下只是解决问题的一两种方法, 当然方法有很多, 需要再进一步的思考
示例代码
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 }} />
);
}
以上可以根据具体情况做些改造, 比如关键词的分隔符, 加些类型判断