Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Одноразовый парсер. нужен многоразовый )) (https://javascript.ru/forum/misc/26816-odnorazovyjj-parser-nuzhen-mnogorazovyjj.html)

DjDiablo 23.03.2012 13:33

Одноразовый парсер. нужен многоразовый ))
 
Парсим строку, получим её из css стиля.
cssCode=document.styleSheets[0].ownerNode.innerHTML;
 // получим h2{ font-color:#900; font-color:#555; font-size:15px; }"


парсит следующая конструкция.

var css='font-color',
     test=new RegExp(css+'.*:(.*);', 'im');
//здесь выведем результат, на всякий случай двумя функциями
console.log(cssCode.match(test));
console.log(test.exec(cssCode));


В консоле появится вот это.
["font-color:#900;", "#900"]
["font-color:#900;", "#900"]

данные я получил именно те что хотел.
но вот неувязка.
Почему распарсилась только строка font-color:#900;
а вторая строка font-color:#555; нет ???

То есть возвращается только первый найденный элемент.
================================================== =======
upd: такс проблема несколько прикольнее.
первая строка возвращается только в том случае если
cssCode=document.styleSheets[0].ownerNode.innerHTML;


а если указать строку непосредственно, и без перевода каретки
cssCode=	"h2{ font-color:#900; font-color:#555; font-size:15px; }";

тогда возвращается строка от первого font-color до конца строки.

хм получается что парсер парсит от font-color до перевода каретки, типо того.

nerv_ 23.03.2012 14:14

'img'

DjDiablo 23.03.2012 14:30

если бы.
уже пробывал

cssCode=""+CSSStyleSheet.ownerNode.innerHTML;
test=new RegExp('font-color:(.*);', 'img');	

cmd=test.exec(cssCode);
console.log(cssCode);


попрежнему только первая строка.

kobezzza 23.03.2012 14:36

Точка не работает с multiline. Используйте [\s\S] вместо неё.

DjDiablo 23.03.2012 14:44

Цитата:

Сообщение от kobezzza (Сообщение 164561)
Точка не работает с multiline. Используйте [\s\S] вместо неё.

http://www.pcre.ru/eval/font-color%3...262a%3B%09%7D/

В моём случае и вовсе нечего ненаходит.
cssCode=""+CSSStyleSheet.ownerNode.innerHTML;
	test=new RegExp('font-color:([\s\S]*);', 'img');	

	cmd=test.exec(cssCode);
	console.log(cssCode);

DjDiablo 23.03.2012 14:52

попробывал обойтись без точки.
font-color:black;
font-color:white;

cssCode=""+CSSStyleSheet.ownerNode.innerHTML;
test=new RegExp('font-color:([a-z]*);', 'img');	

cmd=test.exec(cssCode);
console.log(cssCode);

результат в консоли: ["font-color:black;", "black"]
тобиш опять получил только первую строку

Мне почему то кажется что дело в каких то волшебных символах в cssCode

nerv_ 23.03.2012 15:00

1. Не понятно зачем Вам многострочный поиск, если ищите в одной строке
2.
Цитата:

Сообщение от kobezzza
Точка не работает с multiline. Используйте [\s\S] вместо неё.

alert( 'получим h2{ font-color:#900; font-color:#555; font-size:15px; }'.match( /font-color:[^;]+/gi ).join( '\n' ) );

kobezzza 23.03.2012 15:12

http://javascript.ru/tutorial/regexp...perenos-stroki

DjDiablo 23.03.2012 15:20

к слову font-color:[^;]+/gi
прекрасно справился с одной строкой
но в строке которую возвращает ownerNode.innerHTML
он как и все предыдущие примеры нашёл только первую строку.

DjDiablo 23.03.2012 15:21

отбой
match сработал корректно
а вот exec нет.

но match мне более чем достаточно.
Спасибо


Часовой пояс GMT +3, время: 16:40.