Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ строки по критерию, Цель: индикация введённых строк 
V
    Опции темы
Munya
Дата 29.2.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Имеем:

поле ввода (input)
блок (div)

В блоке отображаются имеющиеся наименования (в виде ссылок)
При нажатии на один из них он добавляется в поле ввода

Задача:
При редактировании поля ввода необходимо индицировать в блоке введённые элементы.

Что реализовано:

Код

<input type="input" id="brand_input" name="brand_input" onKeyUp=test('brand_input', count_of_items); onMouseUp=test('brand_input', count_of_items); />

<div class="field"><a id="brand_input1" onclick="add_item('adidas,','brand_input1','brand_input');">adidas</a>,        
             <a id="brand_input2" onclick="add_item('nike,','brand_input2','brand_input');">nike</a>,        
             <a id="brand_input3" onclick="add_item('puma,','brand_input3','brand_input');">puma</a>                    
</div>



Скрипт:

Код

 var brand_count;
                         
 function obj(id) 
{
   return document.getElementById(id);
}
                                                
function add_item(ValueOfItem,spanId,IdInput)
    {
    var TextInput=obj(IdInput).value;
        if (TextInput.search(ValueOfItem)==-1)                
            {    
            my_str = new String(obj(IdInput).value);
            if ((my_str.match(/,$/)!=null)||(obj(IdInput).value==''))
                {    
                if(obj(IdInput).value=='')
                    obj(IdInput).value=obj(IdInput).value+''+ValueOfItem;
                else
                    obj(IdInput).value=obj(IdInput).value+'&nbsp;'+ValueOfItem;
                obj(spanId).className='item_selected';
                }    
                else
                {
                obj(IdInput).value=obj(IdInput).value+',&nbsp;'+ValueOfItem;
                obj(spanId).className='item_selected';
                }            
            }                
    }                        
            
function test(InpId,count)
    {        
    var TextInput=obj(InpId).value;        
        for(i=1; i<=count; i++)
        {
                           re = new RegExp("\\b"+obj(InpId+i).innerHTML+',');        
            if (TextInput.search(re)!=-1)
                    
                      obj(InpId+i).className='item_selected';                        
            else
                obj(InpId+i).className='';
        }
    }


Собственно проблема:
Элементы в форме ввода считаются разделёнными если между ними есть запятая.
При этом если элемент такой присутствует в блоке он должен быть отмечен.
Например: 
имеем в форме: super puper, mega super, nike, adidas puma,
в блоке: adidas,   nike,   puma 
При этом зачеркнут должен быть только nike (слева от него запятая, справа тоже)
Adidas не подходит т.к. после него нет запятой, puma - т.к. до неё нет запятой.
В моем же примере puma, в следствие регулярного выражения все равно считается верно вписанной.
PM MAIL   Вверх
ksnk
Дата 29.2.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Надо дальше курить регулярные выражения. там еще есть предпросмотр и постпросмотр


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Munya
Дата 29.2.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Цитата(ksnk @  29.2.2008,  16:52 Найти цитируемый пост)
Надо дальше курить регулярные выражения. там еще есть предпросмотр и постпросмотр

leftContext rightContext  Имеешь в виду?

Хорошо, тогда ворос как организовать анализ посимвольно элементов с конца строки?
Допустим я получил строку слева и мне нужно смотреть с конца до первой запятой минуя пробелы., но

Код


for(index=str.lenght-1; index>0; index--)

  alert(str[index]);



говорит undefine 
PM MAIL   Вверх
ksnk
Дата 29.2.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Нет, не так... Раз уж есть регулярки, нужно их мучить ;-)
Код

function test(s,variants)
{
    var res=[],m,reg=new RegExp('(?:^|,)\\s*('+variants.join('|')+')\\s*(?=,|$)','g');
    
    while(m=reg.exec(s)){
        res.push(m[1]);    
    }
    return res ;    
}

alert(test('super puper, mega super, nike, adidas, puma',['nike','puma','super']))


Вот такая конструевина выводит все элементы из массива вариантов (второй параметр), которые ограничены запятыми или началом-концом строки в строке (первый параметр)


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Munya
Дата 29.2.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Угу попробую, завтра уже smile

Цитата(ksnk @  29.2.2008,  17:21 Найти цитируемый пост)
Нет, не так... Раз уж есть регулярки, нужно их мучить ;-)

А почему такая любовь к регуляркам?
PM MAIL   Вверх
ksnk
Дата 29.2.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Munya @  29.2.2008,  17:26 Найти цитируемый пост)
А почему такая любовь к регуляркам? 

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Munya
Дата 1.3.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Два впроса:
почему здесь необходимо использовать join? Я сам:
Ответ: потому, что составляется регулярка с вариантами шаблонов smile
Условие движения по while - это специфика функции exec? (я знаю, что она выполняет поиск совпадения в специфицированной строке. Возвращает результирующий массив.) 

Это сообщение отредактировал(а) Munya - 1.3.2008, 11:17
PM MAIL   Вверх
ksnk
Дата 1.3.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Munya @  1.3.2008,  10:40 Найти цитируемый пост)
почему здесь необходимо использовать join?

Чтобы регулярка поедала только то, что надо. В этом примере получится 
Код

(?:^|,)\s*(nike|puma|super)\s*(?=,|$)

Цитата(Munya @  1.3.2008,  10:40 Найти цитируемый пост)
Условие движения по while - это специфика функции exec? 

Да. exec - примерный аналог preg_match. Прикрутив к регулярке ключик 'g' и используя такой цикл можно превратить ее в аналог preg_match_all


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Munya
Дата 1.3.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Все пока получилось, спасибо.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.