代码之家  ›  专栏  ›  技术社区  ›  Giovanni Di Milia

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

  •  21
  • Giovanni Di Milia  · 技术社区  · 14 年前

    我正试图写一个“建议搜索框”,但我找不到一个解决方案,可以用保留原始大小写的javascript突出显示子字符串。

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

    计算器

    日历

    逃逸

    我想查看前面所有单词中的搜索字符串,因此结果应该是:

    CA 捕蟑螂器

    CA 伦达

    加利福尼亚州 体育课

    我尝试使用以下代码:

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

    但很明显,这样我就松开了原来的箱子!

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

    9 回复  |  直到 6 年前
        1
  •  52
  •   Michael    7 年前

    对第二个参数使用函数 .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);​
    

    jsFiddle输入示例: https://jsfiddle.net/pawmbude/

        2
  •  5
  •   serby    7 年前

    ES6版本

    const highlight = (needle, haystack) =>
      haystack.replace(new RegExp(needle, 'gi'), str => `<strong>${str}
    </strong>`)
    
        3
  •  1
  •   NVRM    6 年前

    不完全完美,因为它用小写字符替换了所有字符:

    let ߐ = document.body
    function check(_ૐ){
    _ૐ_ = new RegExp(_ૐ, "ig") 
    ߐ.innerHTML=ߐ.innerHTML.replace(_ૐ_,"<b>"+_ૐ+"</b>")
    }
    
    check('ca')
    Calculator
    
    calendar
    
    ESCAPE
    
    Cardan de voiture cassé
        4
  •  0
  •   Larry K    14 年前

    我也做同样的事。

    你需要复印一份。

    我在数据库中存储了一个真正字符串的副本,在所有小写的情况下。

    然后我使用查询字符串的小写版本进行搜索,或者执行不区分大小写的regexp。

    然后,使用主字符串中找到的开始索引,加上查询字符串的长度,突出显示结果中的查询字符串。

    不能在结果中使用查询字符串,因为它的大小写不确定。您需要突出显示 起初的 字符串。

        5
  •  0
  •   Community Tales Farias    7 年前

    很好的结果

    function str_highlight_text(string, str_to_highlight){
       var reg = new RegExp(str_to_highlight, 'gi');
       return string.replace(reg, function(str) {return '<span style="background-color:#ffbf00;color:#fff;"><b>'+str+'</b></span>'});
    }
    

    更容易记住… THX至用户113716: https://stackoverflow.com/a/3294644/2065594

        6
  •  0
  •   rosenfeld    7 年前

    虽然到目前为止其他的答案看起来很简单,但它们不能真正用于许多实际情况,因为它们不能处理正确的文本HTML转义和regexp转义。如果您想突出显示每一个可能的代码片段,同时正确地转义文本,这样的函数将返回您应该添加到建议框中的所有元素:

    function highlightLabel(label, term) {
      if (!term) return [ document.createTextNode(label) ]
      const regex = new RegExp(term.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'), 'gi')
      const result = []
      let left, match, right = label
      while (match = right.match(regex)) {
        const m = match[0], hl = document.createElement('b'), i = match.index
        b.innerText = m
        left = right.slice(0, i)
        right = right.slice(i + m.length)
        result.push(createTextNode(left), hl)
        if (!right.length) return result
      }
      result.push(createTextNode(right))
      return result
    }
    
        7
  •  0
  •   PradeepKN    6 年前

    突出显示搜索项并锚定到第一次出现-开始

    function highlightSearchText(searchText) {
        var innerHTML = document.documentElement.innerHTML;
        var replaceString = '<mark>'+searchText+'</mark>';
        var newInnerHtml = this.replaceAll(innerHTML, searchText, replaceString);
        document.documentElement.innerHTML = newInnerHtml;
        var elmnt = document.documentElement.getElementsByTagName('mark')[0]
        elmnt.scrollIntoView();
    }
    
    function replaceAll(str, querystr, replace) {
        var reg = new RegExp(querystr, 'gi');
        var final_str = str.replace(reg, function(str) {return '<mark>'+str+'</mark>'});
        return final_str
    }
    

    突出显示搜索项并锚定到第一次出现-结束

        8
  •  -1
  •   jasongetsdown    14 年前

    .match() 执行不区分大小写的匹配,并返回大小写完整的匹配数组。

    var matches = str.match(queryString),
        startHere = 0,
        nextMatch,
        resultStr ='',
        qLength = queryString.length;
    
    for (var match in matches) {
        nextMatch = str.substr(startHere).indexOf(match);
        resultStr = resultStr + str.substr(startHere, nextMatch) + '<b>' + match + '</b>';
        startHere = nextMatch + qLength;
    }
    
        9
  •  -1
  •   Avinash    8 年前

    我找到了一个最简单的方法来实现它。javascript正则表达式记住它匹配的字符串。此功能可在此处使用。

    我对代码做了一些修改。

    reg = new RegExp("("+querystr.trim()+")", 'gi');
    final_str = 'foo ' + result.replace(reg, "<b>&1</b>");
    $('#'+id).html(final_str);