Javascript:突出显示保留原始案例的子字符串,但在不区分大小写的模式下搜索

Gio*_*lia 27 javascript regex case-sensitive case-insensitive

我正在尝试编写一个"建议搜索框",我找不到一个解决方案,允许使用javascript保持原始案例突出显示子字符串.

例如,如果我搜索" ca"我在不区分大小写模式下搜索服务器端,我有以下结果:

计算器

日历

逃逸

我想在之前的所有单词中查看搜索字符串,因此结果应为:

Ca lculator

ca lendar

ES CA PE

我尝试使用以下代码:

var reg = new RegExp(querystr, 'gi');
var final_str = 'foo ' + result.replace(reg, '<b>'+querystr+'</b>');
$('#'+id).html(final_str);
Run Code Online (Sandbox Code Playgroud)

但显然这样我放松了原来的情况!

有没有办法解决这个问题?

use*_*716 56

对第二个参数使用函数.replace(),返回带有连接标记的实际匹配字符串.

试一试: http ://jsfiddle.net/4sGLL/

reg = new RegExp(querystr, 'gi');
       // The str parameter references the matched string
       //    --------------------------------------v
final_str = 'foo ' + result.replace(reg, function(str) {return '<b>'+str+'</b>'});
$('#' + id).html(final_str);?
Run Code Online (Sandbox Code Playgroud)

带输入的JSFiddle示例: https ://jsfiddle.net/pawmbude/

  • 最好的方法,虽然我会在没有函数的情况下这样做:`result.replace(reg,'<b> $&</ b>')`.虽然不知道性能,但它看起来更好. (12认同)
  • 但这并不能保证正确的转义。 (2认同)
  • 上面的场景不处理特殊字符跳过。[例如] https://jsfiddle.net/40wfnx3z/ 如果你搜索文本“test(123)”,它会抛出错误“Uncaught Syntax Error: Invalid regular expression: /test(/ :未终止的组”和突出显示功能也会中断。请添加这些功能,然后此解决方案将实现答案。 (2认同)

ser*_*rby 6

ES6版本

const highlight = (needle, haystack) =>
  haystack.replace(new RegExp(needle, 'gi'), str => `<strong>${str}
</strong>`)
Run Code Online (Sandbox Code Playgroud)