【问题标题】:jQuery DataTables - Filter column by exact matchjQuery DataTables - 按完全匹配过滤列
【发布时间】:2012-01-26 10:20:51
【问题描述】:

尝试仅显示与在搜索栏中输入的搜索词完全匹配的内容。

例如,我有一个按 ID# 过滤的搜索栏。我只想显示与输入的确切 # 匹配的记录。

所以如果输入123,我不希望显示1234591239等。仅限123

在常见问题页面上看到了一些关于 bRegex 的信息,但它对我不起作用。有什么想法吗?

【问题讨论】:

    标签: jquery regex search filter datatables


    【解决方案1】:

    这将为您提供列的准确结果。

     table.column(i)
     .search("^" + $(this).val() + "$", true, false, true)
     .draw();
    

    即。搜索(输入,正则表达式,智能,caseInsen)

    【讨论】:

    • 就我而言,我传递了多个搜索值,但此解决方案对我不起作用。你能帮帮我吗?
    • 中断输入中包含特殊字符的那一刻,(例如“+”、“(”、“!”等),这并不罕见。规则 Nr. 1:从不工作输入未经消毒!
    【解决方案2】:

    好的,问题解决了。但是,由于我使用完全匹配的列有时包含多个用逗号分隔的 ID #,因此我将无法使用完全匹配搜索。

    但是对于那些感兴趣的人,这里是答案:

    oTable.fnFilter( "^"+TERM+"$", COLUMN , true); //Term, Column #, RegExp Filter
    

    【讨论】:

    • 您好,先生,我也遇到了同样的问题。我想知道我应该把你提供的代码放在哪里?因为如果它也能解决我的问题,我想尝试一下。希望你能回复。
    • 嘿,我解决了多个ID用逗号分隔的完全匹配问题。对于遇到此问题的任何其他人来说,这是一个可行的小提琴。 jsfiddle.net/digvijayad/0m94e2v7 注意:在我的例子中,id 跨行是唯一的,即当搜索时只有 1 行会返回。
    【解决方案3】:
    $(document).ready( function() {
        $('#example').dataTable( {
            "oSearch": {"bSmart": false}
        } );
    } )
    

    尝试使用 bSmart 选项并将其设置为 false

    来自文档

    “当“bSmart”数据表将使用它的智能过滤方法时(到 数据中任何点的单词匹配),如果为假,则不会 完成。”

    更新

    我发现了这个:

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

    在这个链接http://www.datatables.net/forums/discussion/4096/filtering-an-exact-match/p1

    看起来您可以为每列设置 bSmartbRegex 以及为每列指定手动正则表达式。

    【讨论】:

    • 不是我想要的。所以基本上我有 3 个自定义搜索字段用于过滤表格。我只希望其中一个字段使用精确搜索。对于其他字段,我希望他们仍然使用智能搜索。
    • 另外,bSmart 基本上意味着如果我输入“John Smith”,它会找到这些词的任何组合(即“Smith John”、“John Jack Smith”等.)
    【解决方案4】:

    如果你想从一开始就完全匹配,你可以试试这个代码,

        var table = $('#myTable').DataTable()
        $('#filterrow > th:nth-child(2) > input').on( 'keyup change', function () {
            table
            .column( $(this).parent().index()+':visible' )
            .search( "^" + this.value, true, false, true )
            .draw();
        } );
    

    【讨论】:

    • $('#filterrow > th:nth-child(2) > input') 是一个选择器
    【解决方案5】:

    您可以使用正则表达式进行精确匹配,如下所示:

    var table = $('#dt').DataTable();
    
    $('#column3_search').on('keyup', function () {
        // Note: column() accepts zero-based index meaning the index of first column is 0, second column is 1 and so on.
        // We use `2` here as we are accessing 3rd column whose index is 2.
        table.column(2)
             .search("^" + this.value + "$", true, false, true)
             .draw();
    });
    

    search函数的语法是:

    搜索(输入、正则表达式、智能搜索、不区分大小写)

    在这种情况下,我们禁用 智能搜索,因为当 智能搜索 设置为 true 时,search 函数在内部使用正则表达式。否则,这会在我们的正则表达式和 search 函数使用的正则表达式之间产生冲突。

    有关更多信息,请查看 DataTable 中的以下文档:

    column().search()

    希望对你有帮助!

    【讨论】:

    • 就我而言,我传递了多个搜索值,但此解决方案对我不起作用。你能帮我一下吗?
    • 你能解释一下你到底想做什么吗?
    • 在您给出的示例中 - this.value 是单个值。取而代之的是,我在搜索函数中传递了多个值,即 (1|2|3)。
    • 多个值来自不同的输入字段?
    • @izogfif stackoverflow.com/questions/32846782/…。看一下这个。您可以转义正则表达式保留字符。这样,您可以更轻松地过滤掉这些值。
    【解决方案6】:

    只需将正则表达式和智能设置为 false。你会得到准确的结果。

     $('#yourTableID').DataTable({ 
      search: {
         regex: false,
         smart: false
      }
     })
    

    【讨论】:

    • 就我而言,我传递了多个搜索值,但此解决方案对我不起作用。你能帮帮我吗?
    【解决方案7】:
    $(document).ready(function() {
        tbl = $('#example').dataTable();
        tbl.fnFilter("^" + filter_value + "$");
    });
    

    其中filter_value 是在过滤器字段中输入的字符串。

    【讨论】:

    • 没有返回任何结果...?
    【解决方案8】:

    正则表达式对我来说不是一个方便的解决方案,因为它需要代码中的大量异常。 所以,我的解决方案是在 jquery.datatable.min.js 中添加一个新选项 'exactvalue',默认值为 false(以避免兼容性问题)

        [...]
    p.columns.push({data:n,name:u.sName,searchable:u.bSearchable,exactvalue:u.bExactvalue,orderable:u.bSortable,
        [...]
    d.bFilter&&(m("sSearch_"+l,sa.sSearch),m("bRegex_"+l,sa.bRegex),m("bSearchable_"+l,u.bSearchable),m("bExactvalue_"+l,u.bExactvalue));
        [...]
    q.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bExactvalue:null,bSortable:null,bVisible:null
        [...]
    q.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bExactvalue:false,bSortable:!0,
        [...]
    

    这个新选项将与帖子中的其他数据一起发送:

       [...]
       columns[5][searchable]: true
       columns[5][exactvalue]: true
       columns[5][orderable]: true
       [...]
    

    之后,更改 php ssp 类以接受新值。修改ssp中的filter函数变化:

                if ( $requestColumn['searchable'] == 'true' ) {
                    if ( $requestColumn['exactvalue'] == 'true' ) {
                        $binding = self::bind( $bindings, $str, PDO::PARAM_STR );
                         $columnSearch[] = ($isJoin) ? $column['db']." = ".$binding : "`".$column['db']."` = ".$binding;
                    }else{
                        $binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
                         $globalSearch[] = ($isJoin) ? $column['db']." LIKE ".$binding : "`".$column['db']."` LIKE ".$binding;
                    }
                }
    

    并在单个列上重复过滤

            if ( $requestColumn['searchable'] == 'true' && $str != '' ) {
                if ( $requestColumn['exactvalue'] == 'true' ) {
                    $binding = self::bind( $bindings, $str, PDO::PARAM_STR );
                     $columnSearch[] = ($isJoin) ? $column['db']." = ".$binding : "`".$column['db']."` = ".$binding;
                }else{
                    $binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
                     $columnSearch[] = ($isJoin) ? $column['db']." LIKE ".$binding : "`".$column['db']."` LIKE ".$binding;
                }
            }
    

    现在,在您的表格 columnDefs 定义中,只需添加

    {'targets': 5, 'exactvalue': true}
    

    您的列将被过滤为精确值。

    【讨论】:

      【解决方案9】:

      Datatables 的当前版本支持在列基础上使用真正的精确匹配。

      table.column(i)
      .search($(this).val(), false, false, false)
      .draw();
      

      documentation 解释了每个标志。

      【讨论】:

      • 就我而言,我传递了多个搜索值,但此解决方案对我不起作用。你能帮帮我吗?
      • 这绝对行不通。就像搜索的默认行为一样,这将匹配包含搜索词的表中的值,而不仅仅是那些完全匹配的值。
      【解决方案10】:

      table.column(col_num).search(filter_value + "$", true, true, false).draw();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-24
        • 2021-10-13
        • 1970-01-01
        • 2018-10-20
        • 2018-02-18
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        相关资源
        最近更新 更多