PHP CSS解析器-字符串选择器声明

PHP CSS解析器-字符串选择器声明,php,css,parsing,css-parsing,Php,Css,Parsing,Css Parsing,我希望能够读取CSS文件,并能够将给定选择器的所有声明提取到字符串中。例如,给定以下样式表: h1 { font-size: 15px; font-weight: bold; font-style: italic; font-family: Verdana, Arial, Helvetica, sans-serif; } div.item { font-size: 12px; border:1px solid #EEE; } 我希望能够打电话获取div.item,比如

我希望能够读取CSS文件,并能够将给定选择器的所有声明提取到字符串中。例如,给定以下样式表:

h1 {
  font-size: 15px;
  font-weight: bold;
  font-style: italic;
  font-family: Verdana, Arial, Helvetica, sans-serif;
}

div.item {
  font-size: 12px;
  border:1px solid #EEE;
}
我希望能够打电话获取div.item,比如:

$css->getSelector('div.item');
这会给我一个字符串,比如:

font-size:12px;border:1px solid #EEE;
我一直在四处寻找,但找不到一个解析器可以做到这一点。有什么想法吗

仅供参考:我需要这个能够从CSS转换选择器,并将样式动态嵌入电子邮件中的HTML元素

解决方案
编辑:我提出了自己的原始解决方案,并创建了一个类来完成我想要的任务。请看下面我自己的答案。

我想这就是您想要的:

CssToInlineStyles是一个类,允许您将HTML页面/文件转换为具有内联样式的HTML页面/文件。这在发送电子邮件时非常有用。 我现在正在使用它,效果很好

使用某些方法的示例:

$html = file_get_contents('blue.html');
//我的样式存储在html中

$cssConverter = new CSSToInlineStyles();
$cssConverter->setCleanup(true);
$cssConverter->setHTML($html);
$cssConverter->convert(true);
$cssConverter->setUseInlineStylesBlock(true);

$new_html = $cssConverter->convert();

我提出了自己的原始解决方案,并创建了一个类来完成我想要的任务。我的资料来源在底部

class css2string {
    var $css;

    function parseStr($string) {
        preg_match_all( '/(?ims)([a-z0-9, \s\.\:#_\-@]+)\{([^\}]*)\}/', $string, $arr);
        $this->css = array();
        foreach ($arr[0] as $i => $x)
        {
            $selector = trim($arr[1][$i]);
            $rules = explode(';', trim($arr[2][$i]));
            $this->css[$selector] = array();
            foreach ($rules as $strRule)
            {
                if (!empty($strRule))
                {
                    $rule = explode(":", $strRule);
                    $this->css[$selector][trim($rule[0])] = trim($rule[1]);
                }
            }
        }
    }

    function arrayImplode($glue,$separator,$array) {
        if (!is_array($array)) return $array;
        $styleString = array();
        foreach ($array as $key => $val) {
            if (is_array($val))
                $val = implode(',',$val);
            $styleString[] = "{$key}{$glue}{$val}";

        }
        return implode($separator,$styleString);   
    }

    function getSelector($selectorName) {
        return $this->arrayImplode(":",";",$this->css[$selectorName]);
    }

}
您可以按如下方式运行它:

$cssString = "
h1 {
  font-size: 15px;
  font-weight: bold;
  font-style: italic;
  font-family: Verdana, Arial, Helvetica, sans-serif;
}

div.item {
  font-size: 12px;
  border:1px solid #EEE;
}";

$getStyle = new css2string();
$getStyle->parseStr(cssString);
echo $getStyle->getSelector("div.item");
font-size:12px;border:1px solid #EEE
产出如下:

$cssString = "
h1 {
  font-size: 15px;
  font-weight: bold;
  font-style: italic;
  font-family: Verdana, Arial, Helvetica, sans-serif;
}

div.item {
  font-size: 12px;
  border:1px solid #EEE;
}";

$getStyle = new css2string();
$getStyle->parseStr(cssString);
echo $getStyle->getSelector("div.item");
font-size:12px;border:1px solid #EEE
此解决方案甚至可以处理CSS文件中的注释,只要注释不在选择器中

参考资料:
http://stackoverflow.com/questions/1215074/break-a-css-file-into-an-array-with-php

在谷歌上搜索“php css解析器”时,我首先想到了这个:是的,看看这个。它无法执行单个选择器。。。这是他的待办事项清单。非常好的解决方案。你应该把它作为答案。谢谢。显然我得等8个小时。。。所以我刚刚编辑了我的帖子。谢谢。但是我写了我自己的课。。。看我的问题。如果你的css中有注释会发生什么<代码>$cssString=“h1{/*a}注释*/}”嗯,我为自己构建了这个,我不希望在CSS中有注释。请随意修改和更新它以满足您的需要。这很公平,只是当您决定对代码进行注释时,如果突然出现问题,请不要感到惊讶:)谢谢。。。我知道在for循环中需要另一个preg_匹配来丢弃注释。不过,现在也不用担心。