2013-02-28 100 views
0

我正在處理一個生成多個CSS的腳本。這是腳本。將多個CSS文件合併到一個PHP中

$full_string = ""; 

    foreach($allfiles as $curfile => $file) {   
     $file = $PATH[$curfile] . $file; 
     $file_open = fopen($file , 'r'); 
     $concat = "\n" . fread($file_open , filesize($file)) . "\n"; 
     $full_string .= $concat; 
     fclose($file_open); 
    } 

    return $full_string; 

在這裏,我所有的CSS文件合併成一個。但現在的問題是我不得不比較當前的CSS($文件)與另一個CSS(我們認爲它是overrider.css)。如果$文件是有一個風格類似,

h1 { 
    color: white; 
    background: teal; 
    FONT-FAMILY: arial, helvetica, lucida-sans, sans-serif; 
    FONT-SIZE: 18pt; 
    FONT-STYLE: normal; 
    FONT-VARIANT: normal; 
} 

body 
{ 
    font-family: arial; 
    FONT-SIZE: 14px; 
} 

如果overrider.css是有一個風格類似,

body 
{ 
    font-family: Calibri; 
    color: #3E83F1; 
} 

產生應該然後實施最終CSS(output.css),

h1 { 
    color: white; 
    background: teal; 
    FONT-FAMILY: arial, helvetica, lucida-sans, sans-serif; 
    FONT-SIZE: 18pt; 
    FONT-STYLE: normal; 
    FONT-VARIANT: normal; 
} 

body 
{ 
    font-family: Calibri; 
    FONT-SIZE: 14px; 
    color: #3E83F1; 
} 

這裏,由於override.css中的body的樣式具有font-family,所以它取代原始CSS中的font-family屬性,並且由於顏色是不存在於($ file)中的新屬性,是原始的CSS文件,所以它應該添加屬性到原始的CSS文件。所以如何在PHP中實現這一點,因爲我沒有任何解析CSS的想法。任何想法都將不勝感激。

請注意,我需要通過將輸入作爲file1($ file)和file2(override.css)生成一個新的CSS文件,並且我們需要將output.css與覆蓋的樣式生成一致。

在此先感謝。如果你想font-family: arial;是應用,然後將其添加爲font-family: arial !important;

你不必擔心合併它們,因爲瀏覽器會自動從第一個CSS發現那麼它將顏色的第二CSS顏色添加到body標籤

回答

1

有幾個CSS解析器可用(谷歌「的PHP解析器的CSS」),像this one,我沒有嘗試,但似乎有趣。但我個人會做解析自己 - 以下那種僞PHP算法

  • 讀取所有的文件合併爲一個字符串Str,與所有「\ n」,「\ r」和「\ t」的取代由空間(使解析(比特)更容易)

然後,函數來處理(選擇=>規則)

func deal with selectors and rules: 

rules = array() 
do { 
    S = string from current pos to next `{` excluded (selectors) 
    R = string from '{' to next '}' (rules) 
    r = explode(';', R) 
    lr = make array of rules from r trimmed elements 
    s = explode (',', S) 
    ls = make array of [selector => lr] 

    // same sel: latest rule overwrite existing, added if not exist 
    merge ls into rules 
} while (not '}' and not '@' and not EOF); // the '}' would be the closing media 

return rules 

主要功能來處理媒體,然後調用上述功能

medias = array(); 

func deal with Str 
do { 
    if (first non blank char is @) { 
    media = array of listed medias 
    eat fist '{' 
    } 
    else { 
    media = array ('GLOBAL') 
    } 
    selectorsrules = deal with selectors and rules(rest of Str) 

    foreach (media as m) { 
    merge in medias(m) selectorsrules, same procedure as above 
    } 
} while (not EOF); 

有趣的項目,但我沒有時間來充分實施它。結果在medias數組中。

0

用第二個css覆蓋它。

+0

它應該生成一個新的CSS,而不是css覆蓋... – Stranger 2013-02-28 06:06:08

+0

@Udhay你的意思是找到差異並使用php創建新的css。 – 2013-02-28 06:09:01

0

你有兩個選擇:

  1. 最簡單的方法是改變你的CSS文件,並添加重要的是有它是非常重要的。例如,在CSS中有超過1次的「body」是正確的。而且每當你有一種風格被超越時,就會離開它。當然,這種方法大多是手動的。你必須知道它將被覆蓋的位置以及不在哪裏。

  2. 第二種方法需要字符串解析,正則表達式,我的意思是你應該知道你的方式圍繞字符串廣告如何解析它們。您應該獲取每個文件內容,將它們保存爲一個字符串,並且應該使用正則表達式比較它們是否存在兩個標記,然後合併標記內容。這種方式很容易說,但很難實施。

相關問題