Javascript:使用<b>标记突出显示字符串的一部分</b>

时间:2010-09-01 19:42:25

标签: javascript html regex

我试图通过在匹配的子字符串周围插入<b>标记来突出显示字符串中的匹配项。例如,如果查询是“cat”,那么:

"I have a cat."

应该成为:

"I have a <b>cat</b>."

同样,如果查询是“堆栈溢出”,则:

"Stack Overflow is great."

应该成为:

"<b>Stack Overflow</b> is great."

换句话说,我必须保留原始字符串的大小写,但在匹配时不区分大小写。

到目前为止我尝试的一件事是:

var regex = new RegExp('(' + query + ')', 'i');
return strResult.replace(regex, '<b>$1</b>');

但是,如果查询中有任何括号,这会导致运行时异常,我认为尝试转义所有可能的正则表达式字符会太麻烦。

3 个答案:

答案 0 :(得分:3)

有关如何转义特殊正则表达式字符的信息,请参阅“Escape Regular Expression Characters in String - JavaScript”,例如()

编辑:同时查看this更早的问题,询问非常相似 - 几乎相同 - 问题。

答案 1 :(得分:3)

不要使用正则表达式来操纵HTML。

例如,如果查询是“cat”,则:

I have a <em class="category">dog</em>

将成为破碎标记的混乱。如果查询和文本可能是用户生成的,那么由此产生的HTML注入攻击很可能会给您带来跨站点脚本安全漏洞。

有关如何使用DOM中的正则表达式查找和标记文本的示例,请参阅this question

(为了完整性,这里有一个逃避正则表达式特殊字符的函数,因为在snipplr链接的版本不够。它无法逃脱^$,加上-在字符组中很特别。)

RegExp.escape= function(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
};

答案 2 :(得分:2)