Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.08.2014, 09:03
Аватар для BlancoDima
Интересующийся
Отправить личное сообщение для BlancoDima Посмотреть профиль Найти все сообщения от BlancoDima
 
Регистрация: 29.07.2014
Сообщений: 13

Распарсить параметры атрибута style (RegExp)
Помогите с регуляркой для сбора параметров атрибута style. Я совершенно не могу понять как нужно делать.
Мне нужно получить все свойства и значения стилей расположенных в style
Вот пример стиля:
[CSS]'background-image: url(http://mysite.ru:8080/img/environment/circle_portret2.jpg); position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial; '[/CSS]

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

Я совершенно не знаю регулярки, и единственное до чего я додумался это перечислить свойства и искать до точки с зяпятой =) http://regex101.com/r/hN4kM1/1

Наверняка кто-нибудь делал|сталкивался, но найти готовое решение не получилось к сожалению.

Последний раз редактировалось BlancoDima, 28.08.2014 в 09:06.
Ответить с цитированием
  #2 (permalink)  
Старый 28.08.2014, 09:30
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

можно и сплитом разбить.. какбэ:
var str = 'background-image: url([url]http://mysite.ru:8080/img/environment/circle_portret2.jpg);[/url] position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial';
var p=str.split(';');
p.forEach(function (val){console.log(val.split(':'));})
Ответить с цитированием
  #3 (permalink)  
Старый 28.08.2014, 09:42
Аватар для BlancoDima
Интересующийся
Отправить личное сообщение для BlancoDima Посмотреть профиль Найти все сообщения от BlancoDima
 
Регистрация: 29.07.2014
Сообщений: 13

Сообщение от skrudjmakdak Посмотреть сообщение
можно и сплитом разбить.. какбэ:
var str = 'background-image: url([url]http://mysite.ru:8080/img/environment/circle_portret2.jpg);[/url] position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial';
var p=str.split(';');
p.forEach(function (val){console.log(val.split(':'));})
Сейчас я как раз сплитом и делаю,

function collectStyle( el ) {
	var result = el.split( "; " );
		for ( var i = 0; i < result.length; i++ ) {
			result[ i ] = result[ i ].split( ": " );
		}
	return result;
}


но там неожиданные : бывают, в url например целых 2 раза. Я что бы лишнее не цеплять спличу с пробелом ': ' и '; ' но это до тех пор пока свойства пишутся с пробелами, а на это расчитывать не приходится
Ответить с цитированием
  #4 (permalink)  
Старый 28.08.2014, 09:55
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Как вариант...

var css='background-image: url("http://mysite.ru:8080/img/environment/circle_portret2.jpg"); position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial; ';
var re1=/(^|;)([^:]*)/g;
var re2=/(:)([^;]*)/g;
do {
	var prp=re1.exec(css);
	var val=re2.exec(css);
	alert(prp[2]+'='+val[2]);
} while (prp!=null);
Ответить с цитированием
  #5 (permalink)  
Старый 28.08.2014, 10:01
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Вариант без пробелов...

var css='background-image: url("http://mysite.ru:8080/img/environment/circle_portret2.jpg"); position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial; ';
var re1=/(^|;)(\s*)([^:]*)/g;
var re2=/(:)(\s*)([^;]*)/g;
do {
	var prp=re1.exec(css);
	var val=re2.exec(css);
	alert(prp[3]+'='+val[3]);
} while (prp!=null);
Ответить с цитированием
  #6 (permalink)  
Старый 28.08.2014, 10:39
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Имхо такие вещи лучше доверять самому браузеру:
var css = 'background-image: url("http://mysite.ru:8080/img/environment/circle_portret2.jpg"); position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial;';
var style = document.createElement('div').style;
    style.cssText = css;
for(var i = style.length, out = {}; i--;){
  out[style[i]] = style.getPropertyValue(style[i]) + style.getPropertyPriority(style[i]);
}
console.log(out)

Конечно таким образом отсются неверные значения(см. background-repeat), но они и так вряд ли нужны.
__________________
29375, 35

Последний раз редактировалось Aetae, 28.08.2014 в 10:42.
Ответить с цитированием
  #7 (permalink)  
Старый 28.08.2014, 10:57
Аватар для BlancoDima
Интересующийся
Отправить личное сообщение для BlancoDima Посмотреть профиль Найти все сообщения от BlancoDima
 
Регистрация: 29.07.2014
Сообщений: 13

ksa Спасибо, может не очень красиво, но вариант рабочий вполне!


Сообщение от Aetae Посмотреть сообщение
Имхо такие вещи лучше доверять самому браузеру:
var css = 'background-image: url("http://mysite.ru:8080/img/environment/circle_portret2.jpg"); position: absolute; top: 73px; left: 93px; background-position: 0px 0px; background-repeat: initial initial;';
var style = document.createElement('div').style;
    style.cssText = css;
for(var i = style.length, out = {}; i--;){
  out[style[i]] = style.getPropertyValue(style[i]) + style.getPropertyPriority(style[i]);
}
console.log(out)

Конечно таким образом отсются неверные значения(см. background-repeat), но они и так вряд ли нужны.
Спасибо, огромное!! Это похоже самый правильный в моём случае вариант, и background* мне в принципе не нужен =) так что пусть их режет.
Ответить с цитированием
  #8 (permalink)  
Старый 28.08.2014, 10:58
Профессор
Отправить личное сообщение для alex.vv Посмотреть профиль Найти все сообщения от alex.vv
 
Регистрация: 15.04.2014
Сообщений: 176

Парсить CSS свойства до точки с запятой не совсем верно, т.к. у CSS есть шортхенды (shorthands) - сокращенные записи свойств.
То есть например эта запись

margin: 1px 2px 3px 4px;


на самом деле представляет из себя запись сразу 4-х свойств:

margin-top: 1px;
margin-right: 2px;
margin-bottom: 3px;
margin-left: 4px;


Естественно, есть шортхенды и для других свойств (font, background и пр.)
Ответить с цитированием
  #9 (permalink)  
Старый 28.08.2014, 11:02
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от BlancoDima
может не очень красиво
Вот те на...
Ответить с цитированием
  #10 (permalink)  
Старый 28.08.2014, 11:14
Аватар для BlancoDima
Интересующийся
Отправить личное сообщение для BlancoDima Посмотреть профиль Найти все сообщения от BlancoDima
 
Регистрация: 29.07.2014
Сообщений: 13

Сообщение от ksa Посмотреть сообщение
Вот те на...
Ну в том смысле что не канонично. Но когда это нас останавливало
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск