2011-12-14 23 views
5

Bir CSS dosyasını okumak ve belirli bir seçicinin tüm bildirimlerini bir dizeye ekleyebilmek istiyorum.PHP CSS Ayrıştırıcı - Seçici Bildirimleri Dize

font-size:12px;border:1px solid #EEE; 
: Bana gibi bir dize vermelidir

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

: Ben böyle bir şey arayıp div.item elde edebilmek istiyorum

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

: Örneğin, aşağıdaki stil verilmiş

Etrafa baktım ama tam olarak bunu yapabilen bir ayrıştırıcı bulamıyorum. Herhangi bir fikir?

FYI: Seçicileri CSS'den dönüştürmek ve stilleri e-posta iletilerindeki HTML öğelerine dinamik olarak gömmek için buna ihtiyacım var.

ÇÖZÜM DÜZENLEME: Kendi ham çözümümle geldim ve aradığım şeyi yapmak için bir sınıf oluşturdum. Aşağıda kendi yanıtımı gör.

+1

"php css ayrıştırıcı" Googling bana verdi Bu ilk hit olarak: https://github.com/sabberworm/PHP-CSS-Parser – RoToRa

+0

Evet, şuna baktım. Kişisel seçicileri yapamaz ... bu onun yapılacaklar listesinde. – 0pt1m1z3

+0

çok güzel bir çözüm, bunu –

cevap

2

html içinde saklanır // aramak. Kaynaklarımın alt kısmında referans alınmıştır. aşağıdaki gibi

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

} 

Bunu çalıştırabilirsiniz:

$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"); 

olarak olurdu çıktısı aşağıdaki gibidir:

font-size:12px;border:1px solid #EEE 

Bu çözüm sürece, hatta CSS dosyası içinde yorumları ile çalışır yorumlar seçmenlerin içinde değildir.

Referanslar: 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'inizde yorumlarınız varsa ne olur? '$ cssString =" h1 {/ * a} yorum * /} "; –

+0

Bunu kendim için yaptım ve CSS'mde yorumların olmasını beklemiyorum. İhtiyaçlarınızı karşılamak için değiştirmek ve güncellemek için çekinmeyin. – 0pt1m1z3

+0

Yeterince adil, sadece bir şey aniden bir şey kırarsanız şaşırmayın çünkü _do_ kodunuzu yorum yapmaya karar verirsiniz :) –

2

Ben Bu aradığınız ne olduğunu tahmin:

http://classes.verkoyen.eu/css_to_inline_styles

CssToInlineStyles satır içi stilleri ile HTML sayfalarına/dosyaları HTML sayfalarını/dosyaları dönüştürmek için olanak sağlayan bir sınıftır. E-posta gönderdiğinizde bu çok yararlı olur. Şu anda kullanıyorum ve iyi çalışıyor. Bazı yöntemler kullanılarak

Bir örnek:

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

benim stilleri Ben kendi ham çözüm geldi ve ben olanı yapmak için bir sınıf oluşturdu

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

$new_html = $cssConverter->convert(); 
+0

Teşekkürler. Ama kendi sınıfımı yazdım ... sorumu gördün. – 0pt1m1z3

+0

Bağlantı çalışmıyor – user956584

+0

Güncelleme linki: https: // github.com/tijsverkoyen/CssToInlineStyles – Flor