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

Тема в разделе "Регулярные выражения", создана пользователем Q_BASIC, 14 янв 2015.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Надо из этого:
    Код:
    .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')
    Тут регулярка нужна, как-то так должно быть:
    Код:
    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" />
     
    Последнее редактирование модератором: 14 янв 2015
  2. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Как-то так:
    Код:
    #(.*?)\s*\{\s*(.*?):([^;]*);#
    Но регулярка берет только первый параметр каждого селектора (не уверен, что моя терминология верная), т.е. если будет код такого вида:

    Код:
    body {
    color: #171717;
    text-align: left;
    }
    То "text-align" в результаты уже не попадёт. Это в принципе не возможно сделать с помощью одной регулярки. Да и вообще парсинг подобных структур с помощью регулярок моветон, они создавались для решения немного других задач.
     
    Q_BASIC нравится это.
  3. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    188
    Симпатии:
    228
    Вот еще такой вариант
    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$itemsPREG_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
      )
    
    )
    
     
    Q_BASIC нравится это.
  4. Denixxx

    Denixxx

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

    Потому, когда мне надо было решить подобную задачу, я сделал по-другому.
    1. CSS отдаётся PHP-скриптом.
    Для этого в шаблоне можно просто указать ссыль на этот скрипт в head:
    То есть как на 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:
    https://github.com/Den1xxx/ReloadCMS/tree/master/skins/websat

    Админка же написана наполовину на яваскрипте и выводит настройки для редактирования, с моментальным отображением сайта во фрейме.
    Это выходит немного за рамки темы, но если интересно — вот здесь можно поиграться настройками получившегося шаблона, но без их сохранения: http://fromgomel.com/edit_skin_test/
     
    Последнее редактирование: 15 янв 2015
    Q_BASIC нравится это.
Статус темы:
Закрыта.