我希望能够读取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元素中。
解 编辑:我提出了我自己的原始解决方案,并创建了一个类来做我想要的。请参阅下面的答案。
答案 0 :(得分:2)
我想这就是你要找的东西:
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();
答案 1 :(得分: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
即使注释不在选择器内,此解决方案也可以在CSS文件中使用注释。
参考文献: http://www.php.net/manual/en/function.implode.php#106085 http://stackoverflow.com/questions/1215074/break-a-css-file-into-an-array-with-php