【问题标题】:search exact match and highlight jquery datatable regex搜索完全匹配并突出显示 jquery 数据表正则表达式
【发布时间】:2015-04-21 21:07:52
【问题描述】:

在 jquery 数据表中,我必须过滤完全匹配的结果并突出显示它。对于完全匹配,我正在尝试以下代码,但它不起作用。 fiddle

table.aoPreSearchCols[ iCol ].sSearch = "^\\s*"+'1'+"\\s*$";
table.aoPreSearchCols[ iCol ].bRegex = false;
table.aoPreSearchCols[ iCol ].bSmart= false;

【问题讨论】:

  • 可以描述“它不起作用” 吗?似乎在 jsfiddle.net/yg32o2yh/5 处返回匹配项?
  • 当我输入“xon”时,它会选择第一行。但在“xon”中没有任何字眼
  • 查询 xon not 是否匹配 Tiger Nixon 的预期结果?
  • 是的,如果我的搜索文本是单词的开头,那么只有它应该出现。例如。我有两段“我的话没有限制”“它是无限的”。如果我输入限制,那么第一段应该显示,部分应该隐藏
  • 变量 iCol 似乎返回 undefined ?请参阅 jsfiddle 上的 console

标签: jquery regex jquery-datatables


【解决方案1】:

我认为您需要使用word boundary\b

匹配单词边界。单词边界与 a 的位置匹配 单词字符后面没有或前面没有另一个单词字符。

所以当你有搜索词“limit”和字符串“my word has no limit”时,只有“it is unlimited”第一个字符串是匹配的。所以

$('#search-inp').keyup(function(){
    var term = $(this).val(),
        regex = '\\b' + term + '\\b';

    table.columns(1).search(regex, true, false).draw();
})

突出显示

定义一些静态的“高亮标签”来注入和移除,以便高亮搜索匹配:

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

将高亮标签添加到列内容:

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();
    }        
}  

删除高亮标签:

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();
    }        
}    

全部设置在一起:

$('#search-inp').keyup(function(){
    var term = $(this).val(),
        regex = '\\b' + term + '\\b';

    removeHighlight();
    table.columns(1).search(regex, true, false);
    highlight(term);
})

分叉小提琴 -> http://jsfiddle.net/Lnvbnp6c/


更新。我(通过 cmets)得到的印象是任何地方的整个单词都应该匹配。如果是关于匹配列开头的整个单词:

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

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

如果只是匹配列开头的字符,而不是整个单词:

regex = '^' + term;

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

最后一个可能是用户在搜索字段中输入时最想要的。


作为替代方法,您可以尝试使用自定义过滤器:

$('#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 -> http://jsfiddle.net/x96hzok4/

我的印象是这有点快。当然,如果你有很多行,并且想要搜索多个列,我认为你应该考虑自定义过滤器,并考虑不要对所有字符串进行耗时的完整正则表达式。

【讨论】:

  • 非常感谢您的回答。再想一想。我检查了你附加的小提琴。我需要修改单词边界。正则表达式应该匹配世界开始。
  • 就像我输入“Tige”一样。然后它应该首先选择,我已经从正则表达式中删除了最后一个 '\\b' 但是当我输入“T”时,单词之间的单词 t 也会被突出显示
  • 嘿@amit,这实际上是我刚开始的时候 - 但是当我看到评论时:我有两段“我的话没有限制”“它是无限的”。如果我输入限制,那么第一段应该显示并改变焦点。请参阅更新以获取完全匹配的起始词,或者只匹配起始字符...似乎是您真正想要的起始字符。
  • 摆弄正则表达式 = '\\b' + term + '\\b' 似乎对我有用。我删除了 //regex = '\\b' + 术语最后一个 '\\b'。当我们只输入一个字母时,它有问题
  • @amit "当我们只输入一个字母时,它有问题",是的,你有一个问题,没有什么能比得上那个单个字符..?或者是什么问题?你这么说很有趣,我也有同样的想法,你应该有一个点击按钮而不是即时搜索,或者可能是按键后的延迟。
【解决方案2】:

试试

$('#search-inp').keyup(function(){
    var key = $(this).val();
    var regExp = "."
    if (key)
        regExp = "^\\s*" + key + "\\s*$";

    table.columns(1).search(regExp, true).draw();
});

当搜索 key 为空时,始终将其设置为 . 匹配 regex 中的 any

【讨论】:

    【解决方案3】:

    试试

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

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

    column().search();另见$.fn.dataTable.util.escapeRegex()

    【讨论】:

    • 感谢您的努力。您的代码正在从段落的开头和结尾进行搜索。我们也可以使用\b,当我们在搜索文本框中留空时会出现问题
    • @amit 在原始帖子中使用了RegExp。不确定是否正确解释“当我们在搜索文本框中留空时出现问题”?可以详细描述一下吗?
    • 如果您搜索某些内容并删除搜索文本,那么所有列表都应该对用户可见,但它没有发生
    • 只搜索Names 吗?
    • 是的,仅供参考
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多