2013-02-28 2 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 ($ file) с другим 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 имеет font-family, он заменяет свойство font-family в исходном CSS и поскольку цвет является новым свойством, которого нет в ($ file), который это оригинальный CSS-файл, поэтому он должен добавить свойство в исходный файл CSS. Итак, как добиться этого в PHP, так как я не имею никакого представления об анализе CSS. Любая идея по этому поводу была бы весьма признательна.

Обратите внимание, что мне нужно сгенерировать новый файл CSS, указав ввод как file1 ($ file) и file2 (override.css), и нам нужно разделить output.css с переопределенными стилями.

Заранее спасибо.

ответ

1

Есть несколько CSS парсеры доступны (Google "PHP CSS парсер"), как this one, что я не пробовал, но, кажется интересным.Но лично я бы сделал разбор себя - следующий такой алгоритм псевдо-PHP

  • читать все файлы в одну строку Str, со всеми «\ п», «\ г» и «\ т» заменить пробел (чтобы сделать разбор (немного) легче)

тогда функция процесса (селектор => правила)

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

если вы хотите font-family: arial; быть применять затем добавить его в качестве font-family: arial !important;

вам не нужно беспокоиться о слиянии их, потому что браузер будет автоматически добавить цвет тела тега из второй CSS цвета, найденного в первом CSS, то это будет перезапишите его вторым css.

+0

Он должен генерировать новый CSS, а не css переопределять ... – Stranger

+0

@Udhay вы имеете в виду найти разницу и создать новый css с помощью php.? –

0

У вас есть 2 варианта:

  1. Простой способ, чтобы изменить ваши CSS файлы и добавить важно, где важно, чтобы быть там. Правильно иметь, например, «тело» в css более одного раза. И всякий раз, когда вы переоцениваете стиль, оставьте его. Конечно, такой подход в основном ручной. Вы должны знать, где он будет перезаписан, а где нет.

  2. Второй подход требует строкового синтаксического анализа, регулярных выражений, и я имею в виду, что вы должны знать свой путь вокруг текстового объявления, как разбирать их. Вы должны получить каждый из файлов, сохранить их в строку, и вы должны сравнить их с помощью регулярного выражения, если тег существует в обоих, а затем объединить содержимое тегов. Этот способ легко сказать, но его сложно реализовать.

Смежные вопросы