我认为你需要使用一个“单词边界”
(word boundary),
\b
:
匹配单词边界。单词边界是指一个单词字符前面或后面没有另一个单词字符的位置。
所以当你有搜索词“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);
})
forked fiddle -> http://jsfiddle.net/Lnvbnp6c/
更新。我通过评论得到的印象是,任何地方都应该匹配整个单词。如果是在列的开头匹配整个单词:
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();
})
上面有带高亮的演示 -> http://jsfiddle.net/x96hzok4/
我的印象是这个方法会更快一些。当然,如果你有很多行数据,并且想要在多列中搜索,我认为你应该考虑使用自定义过滤器,并且不要对所有字符串进行耗时完整的正则表达式匹配。
RegExp
作为参数包含到.search()
中。 - guest271314