search exact match and highlight jquery datatable regex

后端 未结 3 792
抹茶落季
抹茶落季 2020-12-11 04:38

In jquery datatable, I have to filter the result with exact match and highlight it. for exact match I am trying following code but it does not work. fiddle

t         


        
相关标签:
3条回答
  • 2020-12-11 05:21

    I think you need to use a word boundary, \b :

    Matches a word boundary. A word boundary matches the position where a word character is not followed or preceeded by another word-character.

    So when you have search term "limit" and the strings "my word has no limit", "it is unlimited" only the first string is a match. So

    $('#search-inp').keyup(function(){
        var term = $(this).val(),
            regex = '\\b' + term + '\\b';
    
        table.columns(1).search(regex, true, false).draw();
    })
    

    Highlight

    Define some static "highlight tags" to inject and remove in order to highlight search matches :

    var hlBegin = '<strong class="highlight">',
        hlEnd = '</strong>';
    

    Adding the highlight tags to column content :

    function highlight(term) {
        var row, str,
            rowCount = table.rows().nodes().length,
            regexp = new RegExp('('+term+')', 'ig');
    
        for (row=0; row<rowCount; row++) {
            str = table.cell(row, 1).data();
            str = str.replace(regexp, function($1, match) { 
               return hlBegin + match + hlEnd;
            })
            table.cell(row, 1).data(str).draw();
        }        
    }  
    

    Removing highlight tags :

    function removeHighlight() {
        var row, str,
            rowCount = table.rows().nodes().length;
    
        for (row=0; row<rowCount; row++) {
            str = table.cell(row, 1).data();
            str = str.replace(/(<([^>]+)>)/ig, '');
            table.cell(row, 1).data(str).draw();
        }        
    }    
    

    Setting it all together :

    $('#search-inp').keyup(function(){
        var term = $(this).val(),
            regex = '\\b' + term + '\\b';
    
        removeHighlight();
        table.columns(1).search(regex, true, false);
        highlight(term);
    })
    

    forked fiddle -> http://jsfiddle.net/Lnvbnp6c/


    Update. I got the impression (through comments) that whole words anywhere should be matched. If it is about matching a whole word in the beginning of the column :

    regex = '^' + term + '\\b';
    

    http://jsfiddle.net/Lnvbnp6c/1/

    If it is just about matching characters the column begins with, not nessecarily a whole word :

    regex = '^' + term;
    

    http://jsfiddle.net/Lnvbnp6c/2/

    The last one is probably the one users would like the most, when they are typing in the search field.


    As an alternative approach you could try to use a custom filter :

    $('#search-inp').keyup(function() {
        var str,
            term = $(this).val(),
            regexp = new RegExp('\\b' + term + '\\b', 'ig');
    
        removeHighlight();    
        $.fn.dataTable.ext.search.push(
            function(settings, data, dataIndex ) {
                str = data[1];
                return regexp.test(str) ? true : false;
            }     
        );
        table.draw();
        highlight(term);    
        $.fn.dataTable.ext.search.pop();
    })
    

    demo with highlight as above -> http://jsfiddle.net/x96hzok4/

    My impression is that this is a little bit faster. Certainly, if you have a lot of rows, and want to search on multiple columns, I think you should consider a custom filter, and consider not to make time-consuming complete regular expressions on all strings.

    0 讨论(0)
  • 2020-12-11 05:27

    Try

    $('#search-inp').keyup(function(){
        var key = $(this).val();
        var regExp = "."
        if (key)
            regExp = "^\\s*" + key + "\\s*$";
    
        table.columns(1).search(regExp, true).draw();
    });
    

    When search key is empty always set it to . matches any in regex.

    0 讨论(0)
  • 2020-12-11 05:36

    Try

      $('#search-inp').keyup(function(){
          var elem = $(this)
          table.columns(1)
          .search("^\\s*"+elem.val()+"\\s*$", true)
          .draw()
      });
    

    jsfiddle http://jsfiddle.net/yg32o2yh/6/

    See column().search() ; see also $.fn.dataTable.util.escapeRegex()

    0 讨论(0)
提交回复
热议问题