如果有子括号,如何用PHP分割CSS代码?

时间:2019-01-15 08:09:44

标签: php css parsing

我尝试拆分存储在变量中的CSS代码。 但是,如果我有媒体查询或类似查询,我总是会遇到问题。

我不需要所有详细的规则,但是如果里面有括号,如何解决在括号处分割的问题?

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

结果,我只希望它成为零件:

1:@mediy xzy

  1. div {宽度:100像素; } a {颜色:蓝色;}

3:#other-div

4宽度:200像素;颜色:红色;

如果我只有2个结果(整个块),则删除注释或拆分不会有问题,我可以自己解决。但是我不能用括号解决问题,因为它总是在下一个闭合括号处中断。

2 个答案:

答案 0 :(得分:1)

要获得更好的概览,这是我的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());

错误:未捕获的Sabberworm \ CSS \ Parsing \ OutputException:尝试在/ var / www / vho中打印缺少选择符的声明块[行号:20] ...

答案 1 :(得分:0)

您可以执行以下操作:

<?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;"
//}