2011-12-14 22 views
5

Tôi muốn đọc một tệp CSS và có thể trích xuất tất cả các khai báo của một bộ chọn đã cho trong một chuỗi. Ví dụ, với kiểu sau:Trình phân tích cú pháp CSS PHP - Khai báo chọn cho chuỗi

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

Tôi muốn để có thể gọi và nhận div.item, một cái gì đó như:

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

nào nên cho tôi một chuỗi như:

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

Tôi đã tìm kiếm xung quanh nhưng không thể tìm thấy trình phân tích cú pháp có thể thực hiện chính xác điều đó. Bất kỳ ý tưởng?

FYI: Tôi cần điều này để có thể chuyển đổi bộ chọn từ CSS và nhúng kiểu động vào các phần tử HTML trong thư email.

GIẢI PHÁP EDIT: Tôi đã đưa ra giải pháp thô của riêng mình và tạo một lớp học để làm những gì tôi đang tìm kiếm. Xem câu trả lời của riêng tôi dưới đây.

+1

Googling cho "phân tích cú pháp php css" đã cho tôi đây là lần truy cập đầu tiên: https://github.com/sabberworm/PHP-CSS-Parser – RoToRa

+0

Có, đã xem xét điều đó. Nó không thể làm các bộ chọn riêng lẻ ... đó là trong danh sách việc cần làm của anh ấy. – 0pt1m1z3

+0

giải pháp rất tốt đẹp bạn nên đặt đó là câu trả lời –

Trả lời

2

tôi đã đưa ra giải pháp thô của riêng tôi và tạo ra một lớp học để làm những gì tôi đã tìm kiếm. Nguồn của tôi được tham chiếu ở dưới cùng.

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

} 

Bạn có thể chạy nó như sau:

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

Kết quả sẽ như sau:

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

giải pháp này hoạt động ngay cả với chú thích trong file CSS của bạn, miễn là nhận xét không nằm trong bộ chọn.

Tài liệu tham khảo: 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

Điều gì sẽ xảy ra nếu bạn có nhận xét trong css của mình? '$ cssString =" h1 {/ * a} bình luận * /} ";' –

+0

Vâng, tôi xây dựng nó cho bản thân mình và tôi không mong đợi để có ý kiến ​​trong CSS của tôi. Vui lòng sửa đổi và cập nhật nó để đáp ứng nhu cầu của bạn. – 0pt1m1z3

+0

Đủ công bằng, đừng ngạc nhiên nếu có điều gì đó đột ngột xảy ra khi bạn _do_ quyết định nhận xét mã của bạn :) –

2

Tôi đoán đây là những gì bạn đang tìm kiếm:

http://classes.verkoyen.eu/css_to_inline_styles

CssToInlineStyles là một lớp cho phép bạn chuyển đổi HTML trang/file vào HTML trang/tập tin với phong cách nội tuyến. Điều này rất hữu ích khi bạn gửi email. Tôi đang sử dụng nó ngay bây giờ và hoạt động tốt.

Một ví dụ sử dụng một số phương pháp:

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

// phong cách của tôi được lưu trữ bên trong html

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

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

Cảm ơn. Nhưng tôi đã viết lớp của riêng mình ... xem câu hỏi của tôi. – 0pt1m1z3

+0

Liên kết không hoạt động – user956584

+0

Cập nhật liên kết: https: // github.com/tijsverkoyen/CssToInlineStyles – Flor

Các vấn đề liên quan