2011-12-14 64 views
5

我希望能夠讀取CSS文件,並能夠將給定選擇器的所有聲明提取到字符串中。例如,假設下面的樣式表:PHP 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元素中。

解決方案 編輯:我想出了我自己的原油解決方案,並創建了一個類來做我正在尋找的。在下面看到我自己的答案。

+1

谷歌搜索 「PHP解析器的CSS」 給我這作爲第一擊:https://github.com/sabberworm/PHP-CSS-Parser – RoToRa 2011-12-14 13:41:03

+0

是的,看着那個。它不能做單個選擇器......這是在他的待辦事項列表中。 – 0pt1m1z3 2011-12-14 13:42:42

+0

非常好的解決方案,你應該把它作爲答案 – 2011-12-14 15:00:11

回答

2

我想到了我自己的粗液並創建了一個類做什麼,我是裏面的html尋找。我的來源在底部引用。

class css2string { 
    var $css; 

    function parseStr($string) { 
     preg_match_all('/(?ims)([a-z0-9, \s\.\:#_\[email protected]]+)\{([^\}]*)\}/', $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

2

我想這是你在找什麼:

http://classes.verkoyen.eu/css_to_inline_styles

CssToInlineStyles是一個類,使您的HTML網頁/文件轉換爲HTML的網頁/文件與內嵌樣式。發送電子郵件時,這非常有用。 我現在正在使用它,並正常工作。

使用一些方法的一個例子:

$html = file_get_contents('blue.html'); 

//我的樣式存儲

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

$new_html = $cssConverter->convert();