2013-02-28 104 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. 第二种方法需要字符串解析,正则表达式,我的意思是你应该知道你的方式围绕字符串广告如何解析它们。您应该获取每个文件内容,将它们保存为一个字符串,并且应该使用正则表达式比较它们是否存在两个标记,然后合并标记内容。这种方式很容易说,但很难实施。

相关问题