【问题标题】:PHP CSS Parser - Selector Declarations to StringPHP CSS Parser - 选择器声明到字符串
【发布时间】:2012-01-20 06:30:45
【问题描述】:

我希望能够读取 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 元素中。

解决方案 编辑:我想出了自己的粗略解决方案,并创建了一个类来做我正在寻找的东西。请参阅下面我自己的答案。

【问题讨论】:

  • 谷歌搜索“php css parser”给了我这个作为第一个命中:github.com/sabberworm/PHP-CSS-Parser
  • 是的,看过了。它不能做单独的选择器......那在他的待办事项列表中。
  • 非常好的解决方案,你应该把它作为答案
  • 谢谢。显然我必须等待 8 小时......所以我刚刚编辑了我的帖子。

标签: php css parsing css-parsing


【解决方案1】:

我想这就是你要找的:

http://classes.verkoyen.eu/css_to_inline_styles

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();

【讨论】:

  • 谢谢。但我写了自己的课......看我的问题。
【解决方案2】:

我想出了自己的粗略解决方案,并创建了一个类来做我正在寻找的事情。底部引用了我的来源。

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

只要 cmets 不在选择器内,即使在 CSS 文件中使用 cmets,此解决方案也适用。

参考资料: http://www.php.net/manual/en/function.implode.php#106085 http://stackoverflow.com/questions/1215074/break-a-css-file-into-an-array-with-php

【讨论】:

  • 如果您的 css 中有 cmets 会怎样? $cssString = "h1 { /* a } comment*/ }";
  • 好吧,我为自己构建了这个,我不希望在我的 CSS 中有 cmets。随意修改和更新它以满足您的需求。
  • 很公平,当您确实决定评论您的代码时,如果突然出现问题,请不要感到惊讶:)
  • 谢谢...我知道在 for 循环中需要另一个 preg_match 来丢弃评论。但同样,现在不需要担心。
猜你喜欢
  • 2022-06-27
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多