2011-12-14 19 views
5

CSSファイルを読み込み、指定されたセレクタの宣言をすべて文字列に抽出できるようにします。PHP CSSパーサー - 文字列のセレクタの宣言

font-size:12px;border:1px solid #EEE; 
:私のような文字列を与える必要があります

$css->getSelector('div.item'); 

:私は、のようなものを呼び出し、div.itemを取得できるようにしたい

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; 
} 

:たとえば、次のスタイルシートを与えられました

私は周りを見てきましたが、正確にそれを行うパーサーは見つかりませんでした。何か案は?

FYI:CSSからセレクタを変換し、電子メールメッセージのHTML要素にスタイルを動的に埋め込むことができるようにするには、これが必要です。

解決策 編集:私は自分の原油の解決策を考え出し、私が探していたことをするためのクラスを作成しました。下の自分の答えを見てください。

+1

"PHPのCSSパーサ" のためにグーグルでは、私を与えましたこれは最初のヒットです:https://github.com/sabberworm/PHP-CSS-Parser – RoToRa

+0

はい、それを見ました。それは個々のセレクタを行うことはできません...それは彼のtodoリストにあります。 – 0pt1m1z3

+0

非常に良い解決策は答えとしてそれを置くべきです –

答えて

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

+0

あなたのCSSにコメントがあるとどうなりますか? 「$ cssString =」h1 {/ * a} comment * /} "; ' –

+0

これは自分用に作成したもので、私のCSSにはコメントはありません。あなたのニーズを満たすために自由に変更して更新してください。 – 0pt1m1z3

+0

あなたのコードをコメントすることを決定したときに突然何かが壊れた場合、驚くことはありません:) –

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

ありがとうございます。しかし、私は自分のクラスを書いた...私の質問を参照してください。 – 0pt1m1z3

+0

リンクが動作しません – user956584

+0

更新されたリンク:https:// github。com/tijsverkoyen/CssToInlineStyles – Flor