2015-04-21 2 views
7

В jquery datatable, я должен отфильтровать результат с точным совпадением и выделить его. для точного соответствия. Я пытаюсь использовать следующий код, но он не работает. fiddleпоиск точное совпадение и выделение jquery datatable regex

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

Может описать _ «это не работает» _? Появиться, чтобы вернуться в матче на http://jsfiddle.net/yg32o2yh/5/? – guest271314

+0

Когда я набираю «xon», тогда он выбирает первую строку. но в нем нет слова, смотрящего из «xon» – Carlos

+0

Ожидается результат, что запрос 'xon'_not_ соответствует' Tiger Nixon'? – guest271314

ответ

10

Я думаю, вам нужно использовать word boundary, \b:

Соответствует границе слова. Граница слов соответствует позиции, в которой символ слова не соблюдается или не предшествует другому символу слова.

Так что, когда у вас есть поиск по ключевому слову «предел» и строки «мое слово не имеет предела», «это неограниченная» только первая строка матча. Так

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

раздвоенной скрипка ->http://jsfiddle.net/Lnvbnp6c/


Update. У меня сложилось впечатление (через комментарии), что все слова должны быть сопоставлены.Если речь идет о соответствии целого слова в начале колонки:

regex = '^' + term + '\\b'; 

http://jsfiddle.net/Lnvbnp6c/1/

Если речь идет просто о соответствие символов столбца начинается с, не nessecarily целым слова:

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/

У меня сложилось впечатление, что это немного Быстрее. Конечно, если у вас много строк и вы хотите выполнять поиск по нескольким столбцам, я думаю, вы должны рассмотреть собственный фильтр и подумать о том, чтобы не требовать длительных полных регулярных выражений для всех строк.

+0

Большое спасибо за хороший ответ. Еще один пример. Я проверил скрипку, прикрепленную вами. Мне нужно изменить границу слова. Регулярное выражение должно соответствовать началу игры. – Carlos

+0

Как будто я набираю «Тидж». Затем он должен выбрать сначала, я удаляю последний «\\ b» из регулярного выражения, но когда я набираю «T», тогда слово «t» между словом также становится подсвеченным. – Carlos

+0

hey @amit. На самом деле я был запущен - но когда я увидел комментарий: «У меня есть два абзаца:« Мое слово не имеет предела »,« оно неограничено ». Если я набираю лимит, первый абзац должен показывать и изменять focus_. См. Обновление либо для точного совпадения стартового слова, либо для соответствия стартовым символам ... Кажется, вы начинаете символы, которые вам действительно нужны. – davidkonrad

0

Попробуйте

$('#search-inp').keyup(function(){ 
     var elem = $(this) 
     table.columns(1) 
     .search("^\\s*"+elem.val()+"\\s*$", true) 
     .draw() 
    }); 

jsfiddle http://jsfiddle.net/yg32o2yh/6/

См column().search(); Смотри также $.fn.dataTable.util.escapeRegex()

+0

Спасибо за ваши усилия. Ваш код выполняет поиск с начала и до конца абзаца. Мы также можем использовать \ b, и у него есть проблема, когда мы оставляем пустое поле в текстовом поле поиска. – Carlos

+0

@amit Используется 'RegExp' в исходном сообщении. Не определенно интерпретировать _ «у него есть проблема, когда мы оставляем пустое поле в текстовом поле поиска» _ правильно? Можете описать детали? – guest271314

+0

, если вы что-то ищете, и если вы удалите текст поиска, то весь список должен быть видимым для пользователя, но этого не происходит. – Carlos

1

Попробуйте

$('#search-inp').keyup(function(){ 
    var key = $(this).val(); 
    var regExp = "." 
    if (key) 
     regExp = "^\\s*" + key + "\\s*$"; 

    table.columns(1).search(regExp, true).draw(); 
}); 

Когда поиск key пуст всегда установить его . матчей any в regex.

Смежные вопросы