【发布时间】:2012-01-26 10:20:51
【问题描述】:
尝试仅显示与在搜索栏中输入的搜索词完全匹配的内容。
例如,我有一个按 ID# 过滤的搜索栏。我只想显示与输入的确切 # 匹配的记录。
所以如果输入123,我不希望显示12345、91239等。仅限123。
在常见问题页面上看到了一些关于 bRegex 的信息,但它对我不起作用。有什么想法吗?
【问题讨论】:
标签: jquery regex search filter datatables
尝试仅显示与在搜索栏中输入的搜索词完全匹配的内容。
例如,我有一个按 ID# 过滤的搜索栏。我只想显示与输入的确切 # 匹配的记录。
所以如果输入123,我不希望显示12345、91239等。仅限123。
在常见问题页面上看到了一些关于 bRegex 的信息,但它对我不起作用。有什么想法吗?
【问题讨论】:
标签: jquery regex search filter datatables
这将为您提供列的准确结果。
table.column(i)
.search("^" + $(this).val() + "$", true, false, true)
.draw();
即。搜索(输入,正则表达式,智能,caseInsen)
【讨论】:
好的,问题解决了。但是,由于我使用完全匹配的列有时包含多个用逗号分隔的 ID #,因此我将无法使用完全匹配搜索。
但是对于那些感兴趣的人,这里是答案:
oTable.fnFilter( "^"+TERM+"$", COLUMN , true); //Term, Column #, RegExp Filter
【讨论】:
$(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
看起来您可以为每列设置 bSmart 和 bRegex 以及为每列指定手动正则表达式。
【讨论】:
如果你想从一开始就完全匹配,你可以试试这个代码,
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();
} );
【讨论】:
您可以使用正则表达式进行精确匹配,如下所示:
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 中的以下文档:
希望对你有帮助!
【讨论】:
只需将正则表达式和智能设置为 false。你会得到准确的结果。
$('#yourTableID').DataTable({
search: {
regex: false,
smart: false
}
})
【讨论】:
$(document).ready(function() {
tbl = $('#example').dataTable();
tbl.fnFilter("^" + filter_value + "$");
});
其中filter_value 是在过滤器字段中输入的字符串。
【讨论】:
正则表达式对我来说不是一个方便的解决方案,因为它需要代码中的大量异常。 所以,我的解决方案是在 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}
您的列将被过滤为精确值。
【讨论】:
Datatables 的当前版本支持在列基础上使用真正的精确匹配。
table.column(i)
.search($(this).val(), false, false, false)
.draw();
documentation 解释了每个标志。
【讨论】:
table.column(col_num).search(filter_value + "$", true, true, false).draw();
【讨论】: