Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.06.2014, 22:13
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

Регулярное выражение не учитывающие некоторые символы
Привет форумчане

Есть страница со списком номеров и фильтром. Фильтр чувствителен ко всем символам, а номера оформлены со скобками и тире, причем все по-разному (пример 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
}

Последний раз редактировалось yura29, 19.06.2014 в 15:27. Причина: Новоя информация о проблеме
Ответить с цитированием
  #2 (permalink)  
Старый 18.06.2014, 22:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от yura29
В ней нужно найти 8-(928), но данные эти вводятся через фильтр, поэтому пользователю неудобно будет вводить тире и скобки
можно ещё раз как-то совсем просто -- чтоб понялось что хотите и для чего
Ответить с цитированием
  #3 (permalink)  
Старый 18.06.2014, 22:27
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Скачай regex coach либо любой наподобие
либо воспользуйся онлайн сервисами http://regex101.com/ и тесть свои регулярки
Ответить с цитированием
  #4 (permalink)  
Старый 18.06.2014, 22:59
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

Рони
Я уже создавал тему на этот вопрос, но она как-то заглохла из-за того, что вопрос поставил непонятно
Щас пытался объяснить как можно понятнее, но вот снова меня не поняли
У меня есть страница со списком номеров и фильтр, в который вбиваешь цифры, а он скрывает номера без совпадений
Номера эти оформлены с тире и скобками, но пользователь же не будет вбивать скобки и тире, так как это очень неудобно, а фильтр видит, что нет совпадений(потому что стоят скобки и тире) и скрывает нужные номера
Надо чтобы фильтр не обращал внимания на тире и скобки
Ответить с цитированием
  #5 (permalink)  
Старый 18.06.2014, 23:03
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

здесь можно легко обойтись без регулярок. Задайте элементу списка аттрибут, например, data-clearnum с чистым номером без скобок и скрывайте номера без совпадений по этому признаку
Ответить с цитированием
  #6 (permalink)  
Старый 18.06.2014, 23:11
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

Сообщение от BETEPAH Посмотреть сообщение
здесь можно легко обойтись без регулярок. Задайте элементу списка аттрибут, например, data-clearnum с чистым номером без скобок и скрывайте номера без совпадений по этому признаку
Уже пробовал, но тут столкнулся с другой проблемой
Плагин меняет html самого номера в списке, чтобы подкрасить совпадающую часть

Что-то вроде того: <span style="color: red">8928</span> 111111111
Так что искать надо в самом номере со скобками
Ответить с цитированием
  #7 (permalink)  
Старый 18.06.2014, 23:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

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>
Ответить с цитированием
  #8 (permalink)  
Старый 18.06.2014, 23:41
Интересующийся
Отправить личное сообщение для yura29 Посмотреть профиль Найти все сообщения от yura29
 
Регистрация: 17.08.2013
Сообщений: 17

Огромное спасибо))
Все заработало
Буду с кодом разбираться
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить регулярное выражение yura29 Общие вопросы Javascript 3 08.06.2014 00:35
Регулярное выражение и метод test tsigel Общие вопросы Javascript 3 30.08.2013 13:47
регулярное выражение literator Ваши сайты и скрипты 1 18.08.2013 18:24
регулярное выражение martinss jQuery 5 29.07.2011 12:46
регулярное выражение theo_ Общие вопросы Javascript 15 21.06.2010 10:29