2011-12-14 13 views
5

मैं एक सीएसएस फ़ाइल पढ़ने में सक्षम होना चाहता हूं, और एक स्ट्रिंग में दिए गए चयनकर्ता की सभी घोषणाओं को निकालने में सक्षम होना चाहता हूं।PHP सीएसएस पार्सर - स्ट्रिंग करने के लिए चयनकर्ता घोषणा

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 प्राप्त करने के लिए, सक्षम होना चाहते हैं:

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

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

कौन सा मेरे जैसे एक स्ट्रिंग देना चाहिए उदाहरण के लिए, निम्नलिखित स्टाइलशीट दिया

मैं चारों ओर देख रहा हूं लेकिन एक पार्सर नहीं ढूंढ सकता जो वास्तव में ऐसा कर सकता है। कोई विचार?

एफवाईआई: मुझे इसे सीएसएस से चयनकर्ताओं को बदलने में सक्षम होने और ईमेल संदेशों में HTML तत्वों में शैलियों को गतिशील रूप से एम्बेड करने की आवश्यकता है।

समाधान संपादित करें: मैं अपने स्वयं के कच्चे समाधान के साथ आया और जो कुछ मैं ढूंढ रहा था उसे करने के लिए एक वर्ग बनाया। नीचे अपना खुद का जवाब देखें।

+1

"php सीएसएस पार्सर" के लिए Googling मुझे दिया यह पहली हिट के रूप में: https://github.com/sabberworm/PHP-CSS- पार्सर – RoToRa

+0

हां, उस पर ध्यान दिया। यह व्यक्तिगत चयनकर्ता नहीं कर सकता ... वह अपनी todo सूची में है। – 0pt1m1z3

+0

बहुत अच्छा समाधान आपको इसे –

उत्तर

2

मैं अपने खुद के कच्चे समाधान के साथ आया था और मैं क्या था करने के लिए एक श्रेणी का निर्माण अंदर जमा हो जाती है खोज रहे हैं मेरे स्रोतों को नीचे संदर्भित किया गया है।

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 

यह समाधान के रूप में भी अपने सीएसएस फ़ाइल के भीतर टिप्पणी के साथ काम करता है, जब तक टिप्पणियां चयनकर्ताओं के अंदर नहीं हैं।

संदर्भ: 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

यदि आपके सीएसएस में टिप्पणियां हैं तो क्या होता है? '$ cssString =" h1 {/ * a} टिप्पणी * /} ";' –

+0

ठीक है, मैंने इसे अपने लिए बनाया है और मुझे अपने सीएसएस में टिप्पणियां होने की उम्मीद नहीं है। अपनी आवश्यकताओं को पूरा करने के लिए इसे संशोधित करने और अपडेट करने के लिए स्वतंत्र महसूस करें। – 0pt1m1z3

+0

पर्याप्त मेला, अगर आश्चर्य हो तो अचानक कुछ तोड़ने पर आश्चर्यचकित न हों जब आप अपने कोड पर टिप्पणी करने का निर्णय लेते हैं :) –

2

मुझे लगता है कि यह आपके लिए क्या देख रहे है:

http://classes.verkoyen.eu/css_to_inline_styles

CssToInlineStyles एक वर्ग आप इनलाइन शैलियों के साथ एचटीएमएल-पृष्ठों/फाइलों में एचटीएमएल-पृष्ठों/फ़ाइलों को कनवर्ट करने के लिए सक्षम बनाता है। जब आप ईमेल भेज रहे हों तो यह बहुत उपयोगी है। मैं अभी इसका उपयोग कर रहा हूं और ठीक काम करता हूं।

एक उदाहरण कुछ तरीकों का उपयोग कर:

$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

संबंधित मुद्दे