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


Автор: KuZyagroup 25.2.2008, 19:21
Есть строка #smth(smthelse*=smthelseone)
Хочу порезать в массив split ф-цией, трабла в том что я не понимаю как задать два символа, а любой из smth может быть *
Для ясности (что б не прибегать к телепатии дам примеры)
Код

строка #smth(smthelse*=smthelseone) режется в [smth,smthelse,smthelseone]
строка #*(smthelse*=smthelseone)       в      [*,smthelse,smthelseone]

Автор: ksnk 25.2.2008, 22:54
Код

var s='#*(smthelse*=smthelseone)';//'#smth(smthelse*=smthelseone)';
alert(s.split(/#|\(|\*=|\)/));

вот так? Правда потом придется пустые строки повыкидывать...

Автор: KuZyagroup 25.2.2008, 23:10
спасибо, а я забыл что * - символ перед которым нужен бэк-слэш.
П.С. Вот список всех таких символов если кому нибудь понадобится.
Код

^ [ . $ { * ( \ + ) | ? < > 

Автор: AKS 26.2.2008, 09:20
Если мои предположения по поводу предназначения этих строк верны, то тогда имели бы смысл следующие действия.
Создать шаблон, на соответствие которому будет проверяться строка (ведь нет смысла разбивать строку, не зная ее значения, а потом еще пытаться использовать непредсказуемый результат, да еще, как отмечено, выкидывать пустые строки). Затем вызвать метод match на строке для проверки совпадения с шаблоном, тем самым убивая сразу двух зайцев:
  • проверка соответствия;
  • получение массив нужных строк.

Автор: KuZyagroup 26.2.2008, 14:43
AKS, я не до конца понял что вы имели в ввиду по этому сформулирую задачу которую я себе поставил.
Строка содержит три атрибута
Код

1. tag name|"*"
2. attr name | css attr name
3. attr value

Связаных #,(,*=|==|ect,)
Например
Код

#td(class*=odd)
#*(id*=i_)
#td(margin-left==15px)

Автор: AKS 26.2.2008, 19:21
Цитата(KuZyagroup @  26.2.2008,  14:43 Найти цитируемый пост)
...я не до конца понял что вы имели в ввиду

А что непонятного? Вы пишите:
Цитата(KuZyagroup @  26.2.2008,  14:43 Найти цитируемый пост)
Строка содержит три атрибута... Связаных #,(,*=|==|ect,)

Просто переведите это на язык регулярных выражений, не забыв заключить символы, описывающие три интересующих фрагмента строки, в захватывающие скобки. Затем используйте  метод match (String.prototype.match) или exec (RegExp.prototype.exec).

Автор: KuZyagroup 26.2.2008, 23:54
Если я не ошибаюсь то в match-е описывают содержимое выборки. То есть что брать, а в сплит-е чем разделено то что брать
Почему по Вашему match будет рациональней чем split
P.S. Что до пустых строк которые даёт split, то я точно знаю что это будет 0-вая и 4-тая,- по этому не считаю их наличие минусом.

Автор: AKS 27.2.2008, 07:34
Цитата(KuZyagroup @  26.2.2008,  23:54 Найти цитируемый пост)
Если я не ошибаюсь то в match-е описывают содержимое выборки. То есть что брать, а в сплит-е чем разделено то что брать

Вам нужен результат (т.е. три строки - name, attr, value) или что-то еще?

Цитата(KuZyagroup @  26.2.2008,  23:54 Найти цитируемый пост)
Почему по Вашему match будет рациональней чем split

Цитата(AKS @  26.2.2008,  09:20 Найти цитируемый пост)
# проверка соответствия;
# получение массива нужных строк.


Цитата(KuZyagroup @  26.2.2008,  23:54 Найти цитируемый пост)
Что до пустых строк которые даёт split, то я точно знаю что это будет 0-вая и 4-тая

Результат выполнения кода из примера ksnk в IE видели?


Автор: ksnk 27.2.2008, 07:56
Цитата(AKS @  27.2.2008,  07:34 Найти цитируемый пост)
 выполнения кода из примера ksnk в IE видели?

Гыы! забавно... Не думал, что split настолько различается. 
Действительно, match будет поприличнее
Код

var s='#*(smthelse*=smthelseone)';//'#smth(smthelse*=smthelseone)';
alert(s.match(/#(.*?)\((.*?)\*?=?=(.*?)\)/).slice(1));
 
Правда магии здесь немного больше smile

Хотя можно,конечно, для кроссбраузерности в первом варианте добавить какой-нибудь мусор сначала и с конца строки, но это немного не спортивно smile

Автор: KuZyagroup 27.2.2008, 08:45
AKS, 
ksnk, ага понял, теперь осталось полностью вкурить /#(.*?)\((.*?)\*?=?=(.*?)\)/

Автор: AKS 27.2.2008, 09:06
Цитата(ksnk @  27.2.2008,  07:56 Найти цитируемый пост)
Правда магии здесь немного больше smile

Так ведь она (магия) того стоит. Взять хотя бы упомянутый margin-left=15px. Если задать неверное значение, например '*15px', обращаясь к объекту style, то IE выдаст ошибку:
Код

elem.style.marginLeft = '*15px'; // => недопустимый аргумент

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

Цитата(ksnk @  27.2.2008,  07:56 Найти цитируемый пост)
Хотя можно,конечно, для кроссбраузерности в первом варианте добавить какой-нибудь мусор сначала и с конца строки...

Вы этому (в смысле добавки мусора) у John Resig’а научились, увлекшись jQuery?  ;)

Автор: ksnk 27.2.2008, 10:12
Цитата(AKS @  27.2.2008,  09:06 Найти цитируемый пост)
...А если к написанию регвыра подойти чуть серьезней...

Все в рамках заявленной спецификации smile
Цитата(AKS @  27.2.2008,  09:06 Найти цитируемый пост)
Вы этому (в смысле добавки мусора) у John Resig’а научились, увлекшись jQuery?  ;)

Нее! Это я и сам умею ;-)

Автор: AKS 27.2.2008, 10:57
Цитата(ksnk @  27.2.2008,  10:12 Найти цитируемый пост)
Все в рамках заявленной спецификации 

Да я ведь не имел ввиду ваш регвыр. Просто хотел написать, что можно установить очень жесткие условия (во избежание, т.с.).
Но теперь уж замечу, что ваш регвыр "пропустит" уже упомянутые *15px, а наверно не стоит...

Цитата(ksnk @  27.2.2008,  10:12 Найти цитируемый пост)
Нее! Это я и сам умею ;-)

Я тоже умею, если что. ;)

Автор: ksnk 27.2.2008, 11:49
Цитата(AKS @  27.2.2008,  10:57 Найти цитируемый пост)
 уже упомянутые *15px

Замечу, что "упомянутые" вами, а не автором smile так что пока - 
Цитата(AKS @  27.2.2008,  10:57 Найти цитируемый пост)
Все в рамках заявленной спецификации


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