2015-10-01 1 views
0

Я использую выбранный (chosen website), чтобы сделать selectlist более удобным и функция поиска ищет только одно точное слово.regex для редактирования, чтобы найти несколько слов с выбранными

Я имею в виду, что если список содержит

  • TEST - > Установки Коммуны
  • TEST - > Установки коммун - > Администратор Строительные
  • ИСПЫТАНИЙ - > Установки коммун - > Парковочные
  • TEST - > Установки Коммуны - > Малые здания

и тип пользователя

  • «Установка», все в порядке (Пользователь см 4 записи)
  • «Установка Коммуны», пользователь см 0 результата (потому что, когда есть более чем 1 слово, поиск не работает)

функция поиска

escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 

Как я могу изменить это чтобы пользователь мог искать более одного слова?

Вот полная функция JS:

AbstractChosen.prototype.winnow_results = function() { 
    var escapedSearchText, option, regex, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; 
    this.no_results_clear(); 
    results = 0; 
    searchText = this.get_search_text(); 
    escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
    zregex = new RegExp(escapedSearchText, 'i'); 
    regex = this.get_search_regex(escapedSearchText); 
    _ref = this.results_data; 
    for (_i = 0, _len = _ref.length; _i < _len; _i++) { 
    option = _ref[_i]; 
    option.search_match = false; 
    results_group = null; 
    if (this.include_option_in_results(option)) { 
     if (option.group) { 
     option.group_match = false; 
     option.active_options = 0; 
     } 
     if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { 
     results_group = this.results_data[option.group_array_index]; 
     if (results_group.active_options === 0 && results_group.search_match) { 
      results += 1; 
     } 
     results_group.active_options += 1; 
     } 
     if (!(option.group && !this.group_search)) { 
     option.search_text = option.group ? option.label : option.text; 
     option.search_match = this.search_string_match(option.search_text, regex); 
     if (option.search_match && !option.group) { 
      results += 1; 
     } 
     if (option.search_match) { 
      if (searchText.length) { 
      startpos = option.search_text.search(zregex); 
      text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length); 
      option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos); 
      } 
      if (results_group != null) { 
      results_group.group_match = true; 
      } 
     } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { 
      option.search_match = true; 
     } 
     } 
    } 
    } 
    this.result_clear_highlight(); 
    if (results < 1 && searchText.length) { 
    this.update_results_content(""); 
    return this.no_results(searchText); 
    } else { 
    this.update_results_content(this.results_option_build()); 
    return this.winnow_results_set_highlight(); 
    } 
}; 
+0

Это не было моим опытом. Пока слова непрерывны, они должны соответствовать более чем одному слову (т. Е. «Hello dude» будет соответствовать «Hello dude» и «Hello dudes». Можете ли вы опубликовать jsfiddle с помощью только того окна выбора, который вы используете? – tobylaroni

+0

Вот мой jsfiddle. Вы можете видеть, что он соответствует точно так, как вы ожидали. Не должно быть никаких оснований делать что-то необычное с регулярным выражением. Https://jsfiddle.net/Lf8uw80g/ – tobylaroni

+0

@tobylaroni: да это странно .. Вот мой jsfiddle: http: // jsfiddle.net/RA8ej/168/ – clement

ответ

1

$ (". Chzn-select"). Selected ({"search_contains": true}); является решением для поиска, даже если пользователь вводит что-то не в начале текста.

-1

Вы можете фильтровать массив, используя String.indexOf:

var data = [ 
    "Hello", 
    "Hello dude", 
    "Hello dudes", 
    "Hi dudes" 
]; 

function stringContains(str, value) { 
    return str.indexOf(value) > -1; 
} 

function arrayFilter(arr, value) { 

    var result = []; 

    for (var i = 0; i < arr.length; i+=1) { 

     var subject = arr[i]; 

     if (stringContains(subject, value)) { 
      result.push(subject); 
     } 
    } 

    return result; 
} 

console.log(arrayFilter(data, "Hello")); // ["Hello", "Hello dude", "Hello dudes"] 
console.log(arrayFilter(data, "Hello dude")); // ["Hello", "Hello dude"] 

Или, если вы не заботитесь о prehistoric browsers или с помощью polyfills вы могли бы просто использовать:

function arrayFilter(arr, value) { 
    return arr.filter(function (subject) { 
     return subject.indexOf(value) > -1; 
    } 
} 
+0

Это действительно подход Рубе Голдберга и не затрагивает проблему использования выбранных. Я не хочу ниспровергать, но это действительно не является подходящим ответом на этот вопрос, и я надеюсь, что другие, испытывающие проблемы с избранными, не будут принимать это в качестве своего решения. – tobylaroni

+0

@tobylaroni Почему, трудно ли в наши дни написать простой кусок кода? Он работает, и он также быстрее, чем использование регулярных выражений. – Tim

0

Из чистого регулярного выражения ap ный подход (я не знаю, выбрали), вы можете попробовать что-то вроде:

var splitSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&").split(' '); 
escapedSearchText = ('^((' + splitSearchText.join('|') + ')\\s?){' + splitSearchText.length + '}$'); 

Вот тест, чтобы показать, как она работает (не уверен, что глобальный скрипт работает так же):

var searchText = 'abc edf'; 
 
var splitSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&").split(' '); 
 
var escapedSearchText = ('^((' + splitSearchText.join('|') + ')\\s?){' + splitSearchText.length + '}$'); 
 
var zregex = new RegExp(escapedSearchText, 'i'); 
 

 
alert(zregex.test('abc')); 
 
alert(zregex.test('abc bcd')); 
 
alert(zregex.test('abc edf')); 
 
alert(zregex.test('edf abc'));

+0

@ Gnucky спасибо, но он не работает в приложении: -/ – clement

+0

Хорошо, может быть, вам стоит посмотреть на опции (group_match, search_match, ...). – Gnucki

+0

, очевидно, компонент должен искать фразы, поэтому регулярное выражение не является решением (я не опубликовал хороший вопрос) – clement

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

  • Нет связанных вопросов^_^