Фильтровать данные таблицы, в которых сопоставляются ВСЕ слова запроса - PullRequest
0 голосов
/ 07 марта 2011

Я реализовывал код фильтрации в учебном пособии, приведенном ниже: http://net.tutsplus.com/tutorials/javascript-ajax/using-jquery-to-manipulate-and-filter-data/

Что он делает в основном, так это находит строки, содержащие слова вашего запроса и отображающие только эти строки.Дело в том, что он использует ИЛИ между словами запроса.Так что, если мой запрос 'hello world', он покажет мне строки, в которых есть 'hello' ИЛИ ​​'world'.

То, что я хотел бы сделать, это использовать AND вместо OR, чтобы отображались строки, имеющие «hello» и «world».Код ниже:

function filter(selector, query) {
      query =   $.trim(query); //trim white space
      query = query.replace(/ /gi, '|'); //add OR for regex query

      $(selector).each(function() {
        ($(this).text().search(new RegExp(query, "i")) < 0) ? $(this).hide().removeClass('visible') : $(this).show().addClass('visible');
      });
    }

Спасибо, что помогли мне

1 Ответ

0 голосов
/ 10 марта 2011

Как вы видели, реализация логики ИЛИ в регулярном выражении довольно проста.Выполнение логики «И» немного более вовлечено.Для этого вы можете применить несколько положительных проверочных утверждений с позиции в начале строки.Чтобы проиллюстрировать, как это можно сделать, приведем прокомментированное регулярное выражение, написанное на PHP ...

if (preg_match(
    '/# Match a string containing "word1" AND "word2" AND "word3".
    ^                 # Anchor to start of string
    (?=.*?\bword1\b)  # Ensure there is a "word1" in string
    (?=.*?\bword2\b)  # AND ensure there is a "word2" in string
    (?=.*?\bword3\b)  # AND ensure there is a "word3" in string
    /ix', $contents)) {
    # Successful match. All the words are in the $contents string.
} else {
    # Match attempt failed.
}

Далее все, что вам нужно сделать, это собрать аналогичное регулярное выражение с использованием Javascript.Вот функция фильтра AND:

function filter_AND(selector, query) {
    query = query.split(/\s+/);         // Array of words to be matched.
    var len = query.length;             // Save length for speed in loop.
    var re_word = /^\w(?:.*\w)?$/;      // Regex to validate a single word.
    var regex = '^';                    // Begin assempling our "AND" regex.
    for (var i = 0; i < len; ++i) {     // Loop adding each word to regex.
        if (re_word.test(query[i])) {   // If it begins and ends with '\w',
            regex += '(?=.*?\\b' + query[i] + '\\b)'; // add word to regex.
        }
    }
    regex = new RegExp(regex, 'i');     // Convert string to Regex object.
    $(selector).each(function() {
        ($(this).text().search(regex) < 0) ?
            $(this).hide().removeClass('visible') :
            $(this).show().addClass('visible');
        });
}

Надеюсь, это поможет!8 ^)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...