In jquery datatable, I have to filter the result with exact match and highlight it. for exact match I am trying following code but it does not work. fiddle
t
I think you need to use a word boundary, \b
:
Matches a word boundary. A word boundary matches the position where a word character is not followed or preceeded by another word-character.
So when you have search term "limit" and the strings "my word has no limit", "it is unlimited" only the first string is a match. So
$('#search-inp').keyup(function(){
var term = $(this).val(),
regex = '\\b' + term + '\\b';
table.columns(1).search(regex, true, false).draw();
})
Highlight
Define some static "highlight tags" to inject and remove in order to highlight search matches :
var hlBegin = '<strong class="highlight">',
hlEnd = '</strong>';
Adding the highlight tags to column content :
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();
}
}
Removing highlight tags :
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();
}
}
Setting it all together :
$('#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/
Update. I got the impression (through comments) that whole words anywhere should be matched. If it is about matching a whole word in the beginning of the column :
regex = '^' + term + '\\b';
http://jsfiddle.net/Lnvbnp6c/1/
If it is just about matching characters the column begins with, not nessecarily a whole word :
regex = '^' + term;
http://jsfiddle.net/Lnvbnp6c/2/
The last one is probably the one users would like the most, when they are typing in the search field.
As an alternative approach you could try to use a custom filter :
$('#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 with highlight as above -> http://jsfiddle.net/x96hzok4/
My impression is that this is a little bit faster. Certainly, if you have a lot of rows, and want to search on multiple columns, I think you should consider a custom filter, and consider not to make time-consuming complete regular expressions on all strings.
Try
$('#search-inp').keyup(function(){
var key = $(this).val();
var regExp = "."
if (key)
regExp = "^\\s*" + key + "\\s*$";
table.columns(1).search(regExp, true).draw();
});
When search key
is empty always set it to .
matches any
in regex
.
Try
$('#search-inp').keyup(function(){
var elem = $(this)
table.columns(1)
.search("^\\s*"+elem.val()+"\\s*$", true)
.draw()
});
jsfiddle http://jsfiddle.net/yg32o2yh/6/
See column().search() ; see also $.fn.dataTable.util.escapeRegex()