Анализ строки по критерию

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

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


Надо дальше курить регулярные выражения. там еще есть предпросмотр и постпросмотр
leftContext rightContext  Имеешь в виду?Хорошо, тогда ворос как организовать анализ посимвольно элементов с конца строки?Допустим я получил строку слева и мне нужно смотреть с конца до первой запятой минуя пробелы., но
for(index=str.lenght-1; index>0; index--)  alert(str[index]);
говорит undefine 


Нет, не так... Раз уж есть регулярки, нужно их мучить ;-)
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']))
Вот такая конструевина выводит все элементы из массива вариантов (второй параметр), которые ограничены запятыми или началом-концом строки в строке (первый параметр)


Угу попробую, завтра уже 
Нет, не так... Раз уж есть регулярки, нужно их мучить ;-)
А почему такая любовь к регуляркам?


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


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


почему здесь необходимо использовать join?
Чтобы регулярка поедала только то, что надо. В этом примере получится 
(?:^|,)\s*(nike|puma|super)\s*(?=,|$)
Условие движения по while - это специфика функции exec? 
Да. exec - примерный аналог preg_match. Прикрутив к регулярке ключик 'g' и используя такой цикл можно превратить ее в аналог preg_match_all


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