2011-12-14 10 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

네, 저것을 보았습니다. 그것은 자신의 할일 목록에있는 개별 셀렉터를 할 수 없습니다. – 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.co.kr/tijsverkoyen/CssToInlineStyles – Flor