本文介绍如何

在实际开发中,搜索高亮功能常需支持用户输入多个关键词(如 "from linux"),并期望在原文中独立匹配每个词(无论是否相邻、顺序如何),而非仅匹配连在一起的子串。原始实现:
function highlightSearchTerm(string, substring) {
const regex = new RegExp(`(${substring})`, 'ig');
return string.replace(regex, '$1');
}调用 highlightSearchTerm("From Windows to Linux", "from linux") 会生成正则 /^(from linux)$/i,它试图匹配整个短语 "from linux"(含空格),而原文中 "from" 和 "linux" 被 "Windows to" 隔开,自然无法命中。
✅ 正确解法是将空格分隔的关键词转换为正则中的 |(OR)分隔符,即把 "from linux" → "from|linux",从而生成 /^(from|linux)$/i —— 这样正则引擎会分别查找 "from" 或 "linux",完全忽略它们在原文中的位置与顺序。
以下是健壮、可直接使用的增强版函数:
function highlightSearchTerm(string, substring) {
// 将空格分隔的关键词转为正则 OR 表达式,并对特殊字符转义
const terms = substring
.trim()
.split(/\s+/)
.filter(term => term.length > 0)
.map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); // 转义正则元字符
const pattern = `(${terms.join('|')})`;
const regex = new RegExp(pattern, 'ig');
return string.replace(regex, '$1');
}
// ✅ 使用示例:
console.log(highlightSearchTerm("From Windows to Linux", "from linux"));
// → "From Windows to Linux"
console.log(highlightSearchTerm("Hello world! Welcome to JS.", "hello js world"));
// → "Hello world! Welcome to JS."? 关键注意事项:
总结:跨词高亮的本质是语义匹配 → 正则逻辑转换。只要将用户输入的关键词列表转化为 term1|term2|term3 形式的正则分支,并做好安全转义,即可在任意文本中精准、高效、无序地高亮所有目标词汇。