2013-03-18 2 views
2

Я столкнулся с точкой, из которой я не могу думать дальше. Вкратце, у меня есть ul сотнями li, каждый li имеет десятки слов в виде текста; в самом верху списка я поставил окно ввода для ввода пользователем нескольких ключевых слов; скажем, например, что я хочу отфильтровать из этого огромного списка только строки, в которых существуют следующие три слова в одной строке: «красная сладкая клубника». Будучи нажмите кнопку поиска, линии отфильтровываются и там у меня есть только две строки, содержащие слова Я заинтересован вКак найти несколько подстрок в одном запросе

LI1:. «Я едва ждать, чтобы съесть некоторые красные сладкие клубники»

li2 : «Это лето и красная сладкая клубника сейчас свежие»

До этого момента все в порядке.

Проблема возникает, когда три слова поиска отделяются другими словами или символами вдоль строки. Итак, взятый верхний пример, фильтр никогда бы не показать мне следующую строку:

Li3: «В красного и сладкие клубники находятся на рынке в настоящее время»

Итак, я лег вся функция фильтра и перебирать результаты от верхнего примера:

$(document).ready(function() { 
     var links = new Array(); 
     $("h4").each(function(index, element) { 
     links.push({ 
      text: $(this).text(), 
      element: element 
     }); 
    }); 

    $("#searchbutton").click(function() { 
     var query = $("#inputtext").val(); 
     var querywords = query.split(','); 

     var results = new Array(); 
     for(var i = 0; i < querywords.length; i++) { 
      for(var j = 0; j < links.length; j++) { 
       if (links[j].text.toLowerCase().indexOf(querywords[i].toLowerCase()) > -1) { 
        results.push(links[j].element);      
        } 
      } 
     } 

     $("h4").each(function(index, element) { 
      this.style.display = 'none'; 
     }); 
     for(var i = 0; i < results.length; i++) { 
      results[i].style.display = 'block'; 
     } 

    });  

}); 

можно ли найти несколько подстрок и получить результаты, даже если подстроки разделяются символами или другими словами?

+0

В первом for-loop не должен 'querytext' быть' querywords'? – MikeM

+0

Да, запросы. Я обновил! На этом форуме я только что изменил все «querytext» на «querywords» (чтобы подчеркнуть роли слов в моем примере), и я пропустил это. Благодарю. Тем не менее это не причина. – Auto4x4Motor

+0

MikeM. Я пробовал свой код в соответствии с моими функциями, но, к сожалению, из-за моего плохого понимания синтаксиса RegEx я не смог заставить его работать. Сейчас я узнаю, что это такое об этом RegEx.Еще раз спасибо за ваш код. – Auto4x4Motor

ответ

5

Вот один из способов сделать то, что я думаю, вы хотите.

var results = new Array(); 
for (var i = 0; i < querywords.length; i++) { 
    var regex = new RegExp( 
     '(?=.*\\b' + querywords[i].split(' ').join('\\b)(?=.*\\b') + '\\b)', 'i' 
    ); 
    for (var j = 0; j < links.length; j++) { 
     if (regex.test(links[j].text)) { 
      results.push(links[j].element); 
     } 
    } 
} 

Например, если querywords содержал пункт "red sweet strawberries", тем regex создал бы

/(?=.*\bred\b)(?=.*\bsweet\b)(?=.*\bstrawberries\b)/i 

Три положительный look-aheads используются так, что строки, которые содержат три слова на одной и той же линии, пройти тест (если они окружены границей слов).

Демонстрация: JSFIDDLE.

+0

Это потрясающая работа, MikeM! Ваше решение должно быть в верхнем поисковом запросе для этой проблемы в поиске Google. Теперь я вижу, что indexOf очень ограничен для более широкой функции поиска. Большое вам спасибо за ваши усилия ... С уважением! – Auto4x4Motor

+0

Как пометить эту проблему? – Auto4x4Motor

0

Если я понимаю правильно, то вся проблема:

var querywords = query.split(','); 

В примере запроса у вас нет запятой. Так что, наверное, это ошибка? Разделите запрос с пробелом:

var querywords = query.split(' '); 
+0

Если я разделяю пространство, тогда результаты вернут мне строку с «красным», строкой с «сладким» и так далее. – Auto4x4Motor

+0

Я не ищу, чтобы пользователь каким-либо образом разбил что-либо, так как он ожидает, что он найдет выражение двух или трех слов вместе и не будет разбито. – Auto4x4Motor

+0

Но почему вы разделяете запятую? Это не имеет смысла. Просто разделите запрос на пробел. Вы можете просто проверить, сколько запросов было найдено в каждой строке. Добавьте только строки, в которых были найдены все слова запроса. Или вы можете сортировать строки по количеству найденных запросов. Вы хотите, чтобы поисковые запросы были близки друг к другу? Убедитесь, что разница между возвращаемым значением из indexOf не слишком велика. Возможно, регулярное выражение поможет решить вашу проблему. – vetvicka

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