2012-09-20 49 views
1

Short question:我有一個包含CSS的$ css變量,我想在該變量中找到給定的樣式(在我的情況下是「body」),並用自定義樣式替換它。如何使用PHP替換CSS樣式?

基本輸入輸出

/* blablabla */ 
body { 
    background-color:#d0e4fe; 
    font-family: 'Afamily', sanas-serif; 
} 
span { 
    padding: 5px 
} 
h1 { 
    color:orange; 
    text-align:center; 
} 
body { 
    margin: 10px; 
    padding: 5px; 
} 
p { 
    font-family:"Times New Roman"; 
    font-size:20px; 
} 

我們稱之爲magicFunction():

echo magicFunction($css, 'font-color: pink; font-weight: bold;'); 

而我們得到:

/* blablabla */ 
body { 
    font-color: pink; font-weight: bold; 
} 
span { 
    padding: 5px 
} 
h1 { 
    color:orange; 
    text-align:center; 
} 
p { 
    font-family:"Times New Roman"; 
    font-size:20px; 
} 

有什麼不對?基本上我stucked這裏

$bodyPattern = '/body\s\{[.|\s]*/m'; 
$found = preg_match_all($bodyPattern, $css, $matches); 

它發現只有輸出這樣的東西:

"body { 
    '" 

行回來後什麼都沒有。

當然,一旦我有正確的正則表達式模式,我會使用preg_replace。

我爲什麼要那麼做:我想用我的網站CSS建立一個通訊應用CssToInlineStyle,我想只改變車身造型,以避免一些樣式被應用(如背景色) 。編輯:提及這一點是爲了讓你知道「爲什麼」,隨時發表評論並給出你的觀點,但請僅考慮上述問題,作爲你應該回答的問題。

+0

你第一次懷疑,如果電子郵件客戶端接受CSS這樣呢? –

+0

是他們這樣做,至少GMail的接受它,如果渲染是不是對別人好,這不是什麼大不了的 – AsTeR

+0

我真的很感激所有不明原因的下降票! – AsTeR

回答

0

要麼你serve your CSS-file with PHP。或者你在你的CSS中使用類似SASS的變量。

用PHP解析CSS並使用正則表達式替換變量將導致very bad performance,並給您的服務器帶來很大的負擔。

+0

我的問題沒有從我的服務器服務於CSS,因爲外部文件加載由許多客戶受阻。我已經在使用LESS,但在我的情況下,我認爲我不能寫任何東西來擦除以前的聲明。我不關心性能問題,因爲我只運行這部分代碼一次。 – AsTeR

0

我會使用這樣的CSS。

<style> 
<? include style.php;?> 
</style> 

現在在style.php

body { <? magicFunction('font-color: pink; font-weight: bold;'); 
?> 
} 

h1 { 
    color:orange; 
    text-align:center; 
} 
p { 
    font-family:"Times New Roman"; 
    font-size:20px; 
} 

而且magicFunction會是這樣

function magicFunction($style) { 
    echo $style; 
} 
+0

這是一個醜陋的詭計,但由於我使用LESS,我不認爲嵌入式PHP代碼會做任何事情。這也把我的應用程序的一個小功能的風格依賴關係。 – AsTeR

+0

@AsTeR:這是一個醜陋的伎倆好吧,但而不是嵌入LESS PHP(這將很可能導致編譯錯誤),這將是更容易產生從PHP一個LESS文件。 –

+0

這將需要運行PHP,再到少跑這當一個客戶端在等待......壞主意 – AsTeR

1

我相信你的正則表達式後是這樣的: body {(([a-zA-Z0-9:;#%\(\)\'\-])*\s*)*} - 你需要的格式它適合在PHP多線。

您需要的每一個字符匹配除了{},以確保您只捕獲的機身風格,而不是所有樣式。

我也推薦使用this site在嘗試使用它之前測試regex。我同意其他評論,我認爲你的做法有點瘋狂......但用諾曼貝茨的話說'我們都有時會有點生氣',我知道我有。希望這可以幫助。

編輯:

<?php 
    $css = "body { \n 
     color:#899890;\n 
     }"; 
    $pattern = '/body(\s){0,1}{(([a-zA-Z0-9:;#%\(\)\'\-])*\s*)*}/m'; 
    $found = preg_match_all($pattern, $css, $matches); 

    print_r($matches); 
?> 

生產:

Array 
(
    [0] => Array 
     (
      [0] => body { 

     color:#899890; 

     } 
     ) 

    [1] => Array 
     (
      [0] => 
     ) 

    [2] => Array 
     (
      [0] => 
     ) 

    [3] => Array 
     (
      [0] => ; 
     ) 

) 

這似乎爲我工作。爲了避免需要做這個

+0

謝謝,第一個答案竟是一個答案(和報價使得它非常)。我知道這個設計並不完美,但我接受變得有點瘋狂,因爲沒有其他方法看起來好一點TMHO。我正在測試,儘快。 – AsTeR

+0

它不適用於多行,我理論中的元字符和模式中的m選項應該可以完成這項工作,不是嗎? – AsTeR

+0

我在我的機器上試了一下,並得到它的工作。看我的編輯。 – Dpolehonski

0

一種方式是通過利用CSS的級聯功能:

body { 
    background-color:#d0e4fe; 
    font-family: 'Afamily', sanas-serif; 
} 

<? if (...): ?> 
    body { 
     // overrides the definitions applied above 
     background-color: inherit; 
     font-family: inherit; 

     // and define your own rules 
     font-color: pink; 
     font-weight: bold; 
    } 
<? endif; ?> 
+0

看到@vusan答案,我的評論 – AsTeR

+0

@AsTeR :我不是在建議嵌入式PHP,而是將這些代碼放在HTML文件中;如果您甚至不使用PHP來生成HTML,if語句也可以替換爲/ * * /。 –

+0

那麼TMHO的方法是一樣的 – AsTeR