Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Анализ строки по критерию


Автор: Munya 29.2.2008, 16:37
Имеем:

поле ввода (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, в следствие регулярного выражения все равно считается верно вписанной.

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

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

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

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

Код


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

  alert(str[index]);



говорит undefine 

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

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']))


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

Автор: Munya 29.2.2008, 17:26
Угу попробую, завтра уже smile

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

А почему такая любовь к регуляркам?

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

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

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

Автор: ksnk 1.3.2008, 11:12
Цитата(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

Автор: Munya 1.3.2008, 12:13
Все пока получилось, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)