Регулярное выражение не учитывающие некоторые символы
Привет форумчане
Есть страница со списком номеров и фильтром. Фильтр чувствителен ко всем символам, а номера оформлены со скобками и тире, причем все по-разному (пример 8-928-123-12-12 и 8-(928)-(1)-(3455) и тд) Пользователю неудобно будет вводить тире и скобки, а без них фильтр скрывает нужные номера Вот мне и нужно регулярное выражение, которое не будет учитывать некоторые символы(тире и скобки), чтобы пользователь вводил всего лишь 8928 Возможно есть и другие пути решения моей проблемы, так что я очень надеюсь на вашу помощь UPD Подолбавшись получилась такая тема <script> var filterstr = "444332362"; var num = "\\)?\\-?\\(?" + filterstr.substring(0,3) + "?\\)?\\-?\\(?" + filterstr.substring(3,4) + "?\\)?\\-?\\(?" + filterstr.substring(4,5) + "?\\)?\\-?\\(?" +filterstr.substring(5,6)+ "?\\)?\\-?\\(?" +filterstr.substring(6,7)+ "?\\)?\\-?\\(?" +filterstr.substring(7,8)+ "?\\)?\\-?\\(?" +filterstr.substring(8,9)+ "?\\)?\\-?\\(?"; alert("444332".match(RegExp(num))); alert("444332".indexof(RegExp(num))); </script> Матч выводит все правильно, а вот индексоф тупит и хром выдает ошибку Uncaught TypeError: undefined is not a function Заранее благодарен Если нужно, то вот сам скрипт поиска /** * fastLiveFilter jQuery plugin 1.0.3 * * Copyright (c) 2011, Anthony Bush * License: <http://www.opensource.org/licenses/bsd-license.php> * Project Website: [url]http://anthonybush.com/projects/jquery_fast_live_filter/[/url] **/ jQuery.fn.fastLiveFilter = function(list, options) { // Options: input, list, timeout, callback options = options || {}; list = jQuery(list); var input = this; var lastFilter = ''; var timeout = options.timeout || 0; var callback = options.callback || function() {}; var keyTimeout; // NOTE: because we cache lis & len here, users would need to re-init the plugin // if they modify the list in the DOM later. This doesn't give us that much speed // boost, so perhaps it's not worth putting it here. var lis = list.children(); var len = lis.length; var oldDisplay = len > 0 ? lis[0].style.display : "block"; callback(len); // do a one-time callback on initialization to make sure everything's in sync input.change(function() { // var startTime = new Date().getTime(); var filter = input.val().toLowerCase(); var li, innerHTML, old; var numShown = 0; for (var i = 0; i < len; i++) { li = lis[i]; innerHTML = !options.selector ? (li.textContent || li.innerHTML || "") : $(li).find(options.selector).text(); li.textContent = li.textContent.replace("<span style='background-color: #E66A57'>",""); li.textContent = li.textContent.replace("</span>",""); if (innerHTML.toLowerCase().replace(/-|\(|\)/g,'').indexOf(filter) >= 0) { $(li).html(function(i,o) { return o.replace(filter, "<span style='background-color: #E66A57'>" + filter + "</span>"); }); if (li.style.display == "none") { li.style.display = oldDisplay; } numShown++; } else { if (li.style.display != "none") { li.style.display = "none"; } } } callback(numShown); // var endTime = new Date().getTime(); // console.log('Search for ' + filter + ' took: ' + (endTime - startTime) + ' (' + numShown + ' results)'); return false; }).keydown(function() { clearTimeout(keyTimeout); keyTimeout = setTimeout(function() { if( input.val() === lastFilter ) return; lastFilter = input.val(); input.change(); }, timeout); }); return this; // maintain jQuery chainability } |
Цитата:
|
Скачай regex coach либо любой наподобие
либо воспользуйся онлайн сервисами http://regex101.com/ и тесть свои регулярки |
Рони
Я уже создавал тему на этот вопрос, но она как-то заглохла из-за того, что вопрос поставил непонятно Щас пытался объяснить как можно понятнее, но вот снова меня не поняли У меня есть страница со списком номеров и фильтр, в который вбиваешь цифры, а он скрывает номера без совпадений Номера эти оформлены с тире и скобками, но пользователь же не будет вбивать скобки и тире, так как это очень неудобно, а фильтр видит, что нет совпадений(потому что стоят скобки и тире) и скрывает нужные номера Надо чтобы фильтр не обращал внимания на тире и скобки |
здесь можно легко обойтись без регулярок. Задайте элементу списка аттрибут, например, data-clearnum с чистым номером без скобок и скрывайте номера без совпадений по этому признаку
|
Цитата:
Плагин меняет html самого номера в списке, чтобы подкрасить совпадающую часть Что-то вроде того: <span style="color: red">8928</span> 111111111 Так что искать надо в самом номере со скобками |
yura29,
Вариант ... <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script> /** * fastLiveFilter jQuery plugin 1.0.3 * * Copyright (c) 2011, Anthony Bush * License: <http://www.opensource.org/licenses/bsd-license.php> * Project Website: [url]http://anthonybush.com/projects/jquery_fast_live_filter/[/url] **/ jQuery.fn.fastLiveFilter = function(list, options) { // Options: input, list, timeout, callback options = options || {}; list = jQuery(list); var input = this; var lastFilter = ''; var timeout = options.timeout || 0; var callback = options.callback || function() {}; var keyTimeout; // NOTE: because we cache lis & len here, users would need to re-init the plugin // if they modify the list in the DOM later. This doesn't give us that much speed // boost, so perhaps it's not worth putting it here. var lis = list.children(); var len = lis.length; var oldDisplay = len > 0 ? lis[0].style.display : "block"; callback(len); // do a one-time callback on initialization to make sure everything's in sync input.change(function() { // var startTime = new Date().getTime(); var filter = input.val().toLowerCase(); var matrix = "8-(928)-(123)-(32)-(12)", i = 0, val = filter.replace(/\D/g, ''); filter = matrix.replace(/\d/g, function (a) { return val.charAt(i++) || "_" }) filter = filter.replace(/_.*/g ,'') var li, innerHTML, old; var numShown = 0; for (var i = 0; i < len; i++) { li = lis[i]; innerHTML = !options.selector ? (li.textContent || li.innerHTML || "") : $(li).find(options.selector).text(); li.textContent = li.textContent.replace("<span style='background-color: #E66A57'>",""); li.textContent = li.textContent.replace("</span>",""); if (innerHTML.toLowerCase().indexOf(filter) >= 0) { $(li).html(function(i,o) { return o.replace(filter, "<span style='background-color: #E66A57'>" + filter + "</span>"); }); if (li.style.display == "none") { li.style.display = oldDisplay; } numShown++; } else { if (li.style.display != "none") { li.style.display = "none"; } } } callback(numShown); // var endTime = new Date().getTime(); // console.log('Search for ' + filter + ' took: ' + (endTime - startTime) + ' (' + numShown + ' results)'); return false; }).keydown(function() { clearTimeout(keyTimeout); keyTimeout = setTimeout(function() { if( input.val() === lastFilter ) return; lastFilter = input.val(); input.change(); }, timeout); }); return this; // maintain jQuery chainability } </script> <script> $(function () { $('#search_input').fastLiveFilter('#search_list'); }) </script> </head> <body> <input id="search_input" placeholder="Type to filter"> <ul id="search_list"> <li>8-(928)-(123)-(32)-(12)</li> <li>8-(927)-(123)-(32)-(12)</li> <li>8-(923)-(123)-(32)-(12)</li> </ul> </body> </html> |
Огромное спасибо))
Все заработало Буду с кодом разбираться |
Часовой пояс GMT +3, время: 22:39. |