Парсинг CSS кода

Статус
В этой теме нельзя размещать новые ответы.

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Надо из этого:
Код:
.razdel, .maincont table.table tr td.modgl { color: #171717; }
div.jumbotron { background: rgba(0,0,0,0.3); }
div.maincont { background: #fff; }
body { color: #171717; }
body { background: #c2c2c2; }


Найти такие строчки:
Код:
body { background: #c2c2c2; }

И поместить в массив:
PHP:
$vars['body'] = array('background'=>'#c2c2c2')

не совсем в тему, но уже минут 5 пытаюсь придумать зачем это нужно...
Тут регулярка нужна, как-то так должно быть:
Код:
preg_match_all("#*\{*\:[^;]*\;\}#", $text, $items, PREG_PATTERN_ORDER);
        if(sizeOf($items))
            foreach($items as $item){
Это у меня в форму превращяется, и каждый элемент в отдельном input'е. А ключ переименовывается


Пример:

body { background: #c2c2c2; }

Введите цвет фона страницы:
<input type="text" name="body=>background" value="#c2c2c2" />
 
Последнее редактирование модератором:
Как-то так:
Код:
#(.*?)\s*\{\s*(.*?):([^;]*);#

Но регулярка берет только первый параметр каждого селектора (не уверен, что моя терминология верная), т.е. если будет код такого вида:

Код:
body {
color: #171717;
text-align: left;
}

То "text-align" в результаты уже не попадёт. Это в принципе не возможно сделать с помощью одной регулярки. Да и вообще парсинг подобных структур с помощью регулярок моветон, они создавались для решения немного других задач.
 
Вот еще такой вариант
PHP:
$str = '
.razdel, .maincont table.table tr td.modgl { color: #171717; text-align:center;}
div.jumbotron { background: rgba(0,0,0,0.3); }
div.maincont { background: #fff; }
body { color: #171717; }
body { background: #c2c2c2; }
';

preg_match_all('~([^{}]+)\{|\s*([^:};]+)\s*:\s*([^:};]+)~', $str, $items, PREG_SET_ORDER);

$result = array();
$selector = '';

foreach($items as $item) {
  if (empty($item[1])) { $result[$selector][$item[2]] = $item[3]; }
  else { $selector = trim($item[1]); }
}

print_r($result);
Код:
Array
(
  [.razdel, .maincont table.table tr td.modgl] => Array
  (
    [color] => #171717
    [text-align] => center
  )

  [div.jumbotron] => Array
  (
    [background] => rgba(0,0,0,0.3)
  )

  [div.maincont] => Array
  (
    [background] => #fff
  )

  [body] => Array
  (
    [color] => #171717
    [background] => #c2c2c2
  )

)
 
Вообще парсинг CSS для замены каких-то значений на другие — тот ещё костыль.
Ведь в CSS могут быть сотни значений, и выискивать их и парсить — та ещё нагрузка на хостинг.
С другой стороны, PHP сам по себе прекрасный парсер.

Потому, когда мне надо было решить подобную задачу, я сделал по-другому.
1. CSS отдаётся PHP-скриптом.
Для этого в шаблоне можно просто указать ссыль на этот скрипт в head:
<link rel="stylesheet" href="style.css.php" type="text/css" />
То есть как на css файл. А вот чтобы воспринимался этот файл как надо, магия будет применена внутри него.
2. Файл style.css.php парсит настройки пользователя либо если их нет — настройки по-умолчанию и отдаёт CSS:
Код:
<?php
// если есть настройки, созданные пользователем — используем их, если нет — используем дефолтовые настройки в style.default.php
$css_file = '../../content/skins/'.basename(dirname(__FILE__)).'.ini';
if (is_file($css_file)) $css_config = unserialize(file_get_contents($css_file));
else include('style.default.php');
//здесь магия: php файл выдаёт себя за css
header("Content-type: text/css; charset: UTF-8");
// а теперь отдаём и сами стили
echo'
body {
    margin: 0;
    padding: 0;
    background: '.$css_config['Body background color'].';
    font-family: '.$css_config['Font family'].';
    font-size: '.$css_config['Primary font size, px'].'px;
    color: '.$css_config['Text color'].';
}
// и так далее
3. Ну и если в первый раз никто ничего не настроил, то настройки берутся из дефолтного файла (style.default.php), примерно так:
Код:
<?php
$css_config =
array (
'Skin width, px'=>'940',
'Header height, px'=>'70',
'Logo padding, px'=>'10',
'Primary font size, px'=>'12',
'Body background color'=>'#FFFFFF',
'Text color'=>'#464032',
'Title color'=>'#6E146B',
'Link color'=>'#651262',
'Link color when hovering'=>'#000000',
'Font family'=>'Arial, Helvetica, sans-serif',
// и так далее...
);

Полностью посмотреть как работает подобный код можете в шаблоне websat:
Для просмотра ссылки Войди или Зарегистрируйся

Админка же написана наполовину на яваскрипте и выводит настройки для редактирования, с моментальным отображением сайта во фрейме.
Это выходит немного за рамки темы, но если интересно — вот здесь можно поиграться настройками получившегося шаблона, но без их сохранения: Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху