2013-02-28 14 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의 본문 스타일은 font-family이므로 원래 CSS의 font-family 속성을 대체하고 색상은 ($ file)에없는 새로운 속성이므로 원본 CSS 파일이므로 원본 CSS 파일에 속성을 추가해야합니다. 그래서 PHP에서 이것을 구현하는 방법은 CSS 파싱에 대한 아이디어가 없기 때문입니다. 이것에 대한 어떤 생각이라도 크게 감사 할 것입니다.

입력 내용을 file1 ($ file) 및 file2 (override.css)로 지정해야 새 CSS 파일을 생성해야하므로 output.css에 스타일을 재정의해야합니다.

미리 감사드립니다. 당신이 font-family: arial; 브라우저가 자동으로 먼저 CSS에서이됩니다 발견 색상의 두 번째 CSS에서 body 태그에 색상을 추가하기 때문에 당신이 그들을 병합에 대해 걱정할 필요가 없습니다 다음 font-family: arial !important;

으로 추가 적용 할 수 있도록하려면

답변

1

가, this one처럼 시도하지 않았다 (구글 "PHP는 CSS를 파서") 몇 CSS 파서 사용할 수 있지만, 흥미로운 보인다."\ 연구"와 "\ (t)가"교체 "N \"모두와 함께,

  • 가 하나의 문자열 Str에 모든 파일을 읽을 의사 PHP 알고리즘의 종류 다음 - 그러나 개인적으로는 자신을 구문 분석 할 것 공백으로
  • 다음

, 프로세스 기능 (선택 => 규칙)

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

+0

@Udhay 당신이 차이점을 발견하고 PHP를 사용하여 새 CSS를 만드는 것을 의미합니까? –

0

당신이 개 선택할 수 있습니다!

  1. 간단한 방법은 당신의 CSS 파일을 변경하고 추가하는 것입니다 중요한 거기 것이 중요입니다. 예를 들어 css에서 "body"를 1 번 이상 사용하는 것이 맞습니다. 그리고 언제든지 오버라이드 할 스타일을 남겨 두십시오. 물론 이러한 접근 방법은 대부분 수동적입니다. 어디에 덮어 쓰게 될지 그리고 어디에 있지 않을지를 알아야합니다.

  2. 두 번째 방법은 문자열 구문 분석, 정규식이 필요하며 문자열 광고를 파싱하는 방법을 알아야한다는 의미입니다. 각 파일 내용을 가져 와서 문자열에 저장해야하며, 두 항목 모두에 태그가있는 경우 regex를 사용하여 비교 한 다음 태그 내용을 병합해야합니다. 이 방법은 말하기는 쉽지만 구현하기는 어렵습니다.