Как разделить код CSS с помощью PHP, если у него есть дополнительные скобки? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь разделить мой код CSS, хранящийся в переменных. Но у меня всегда возникают проблемы, если у меня есть медиа-запросы или что-то подобное.

Мне не нужны все подробные правила, но как решить разделить на скобки, если внутри могут быть скобки?

@media xyz { div { width: 100px; } a {color: blue;}}
#other-div { width: 200px; color: red;}

В результате я хочу, чтобы это были только части:

1: @mediy xzy

  1. div {width: 100px; } a {color: blue;}

3: # other-div

4 ширина: 200 пикселей; цвет: красный;

Удаление комментариев или разбиение, если у меня есть только 2 результата (целый блок), не будет проблемой, это я могу решить самостоятельно. Но я не могу решить проблему со скобками внутри, так как она всегда ломается при следующей закрывающей скобке.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Для лучшего обзора вот мой код с Sabberworm.

Первый шаг: просто загрузите и сохраните:

$parser = new Sabberworm\CSS\Parser($cssoutput);
$oCss = $parser->parse();
$critical = $oCss->render(Sabberworm\CSS\OutputFormat::createCompact());

Результатом будут такие проблемы как:

fa-arrow-right:before{content:"ï¡";}.

Хорошо, я попытался удалить правило, например:

$parser = new Sabberworm\CSS\Parser($cssoutput);
$oCss = $parser->parse();
foreach($oCss->getAllRuleSets() as $oRuleSet) {
    $oRuleSet->removeRule('content');
}
$critical = $oCss->render(Sabberworm\CSS\OutputFormat::createCompact());

Но это удаляет намного больше, я не могу специально найти почему и как, но css примерно на половину раньше

И моя основная часть (pq - это функция для phpQuery) приводит к ошибке (также комментируя часть удаления removerule)

$parser = new Sabberworm\CSS\Parser($cssoutput);
$oCss = $parser->parse();
foreach($oCss->getAllDeclarationBlocks() as $oBlock) {
    foreach($oBlock->getSelectors() as $oSelector) {
        echo "selektor: ".$oSelector->getSelector()."<br>";
        if(!pq($oSelector->getSelector())->length)
        {
            $oBlock->removeSelector($oSelector);
        }
    }

    if(count($oBlock->getSelectors()) === 0)
        $oCss->remove($oBlock);
}

$critical = $oCss->render(Sabberworm\CSS\OutputFormat::createCompact());

Ошибка: Uncaught Sabberworm \ CSS \ Parsing \ OutputException: попытка напечатать блок объявления с отсутствующим селектором [строка №: 20] в /var/www/vho...

0 голосов
/ 15 января 2019

Вы можете сделать что-то вроде этого:

<?php

$css = "@media xyz { div { width: 100px; } a {color: blue;}}
#other-div { width: 200px; color: red;}";

// split by line break
$lines = preg_split('/[\r\n]+/', $css);

$parts = [];
foreach ($lines as $line) {

  // parse everything that's not "{" unit first "{" and the rest until last "}"
  preg_match_all('/^([^{]+)\{(.+)\}/', $line, $matches);

  // remove total result
  array_shift($matches);

  // remove second array level + trim
  $matches = array_map(function($match) {
    $match = array_shift($match);
    return trim($match);
  }, $matches);

  // add to parts array
  $parts = array_merge($parts, $matches);
}

var_dump($parts);
//array(4) {
//  [0] =>
//  string(10) "@media xyz"
//  [1] =>
//  string(38) "div { width: 100px; } a {color: blue;}"
//  [2] =>
//  string(10) "#other-div"
//  [3] =>
//  string(25) "width: 200px; color: red;"
//}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...