jQuery DataTables - 按完全匹配过滤列

时间:2011-12-22 20:50:54

标签: jquery regex search filter datatables

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

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

因此,如果输入123,我不希望显示1234591239等。仅123

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

10 个答案:

答案 0 :(得分:37)

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

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

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

答案 1 :(得分:25)

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

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

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

答案 2 :(得分:8)

$(document).ready( function() {
    $('#example').dataTable( {
        "oSearch": {"bSmart": false}
    } );
} )

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

来自文档

  

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

更新

我发现了这个:

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 :(得分:3)

如果您想从头开始完全匹配,可以尝试使用此代码,

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

答案 4 :(得分:1)

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

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函数的语法为:

  

search(输入,正则表达式,smart_search,不区分大小写)

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

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

column().search()

希望有帮助!

答案 5 :(得分:1)

只需设置正则表达式和智能假。您会得到准确的结果。

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

答案 6 :(得分:0)

$(document).ready(function() {
    tbl = $('#example').dataTable();
    tbl.fnFilter("^" + filter_value + "$");
});

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

答案 7 :(得分:0)

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

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

documentation 解释每个标志。

答案 8 :(得分:0)

Regex 对我来说不是一个方便的解决方案,因为它需要代码中有很多例外。 因此,我的解决方案是在 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更改中修改过滤器功能:

            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 :(得分:-2)

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