2012-07-24 69 views
0

我想用PHP替換一些CSS樣式。REGEX與例外匹配(對於CSS)

我想在所有#.前之後添加.myclass任何, 但不是那些行以background並用「;」最後。

到目前爲止,我的正則表達式不起作用。任何幫助,將不勝感激。

這是我的PHP:

$patterns = '/^[^background][,]\s*((#|[.])[^;]+)/m'; 
$replacements = ', .myclass \1'; 
$str= preg_replace($patterns,$replacements, $string, -1); 

原來這裏是CSS:

#class1, #id1, #id2{ 
    margin:0 0 1.5em 0; 
    font-size:2.2em; 
    font-family:Century Schoolbook Bold; 
} 
.class2{ 
    background:#fff, #111, #ccc; 
    font:1.1em; 
    font-family:Century Schoolbook; 
} 

,這裏是所需的CSS:

#class1, .myclass #id1, .myclass #id2{ 
     margin:0 0 1.5em 0; 
     font-size:2.2em; 
     font-family:Century Schoolbook Bold; 
    } 
    .class2{ 
      background:#fff, #111, #ccc; 
     font:1.1em; 
     font-family:Century Schoolbook; 
    } 
+0

您想要在* all *'#'和'.'前添加'.myclass',那麼'#class1'和'.class2'怎麼樣保持不變?在這些規則下'font-size:2.2em;'會變成'font-size:2.myclass2em;'(在'.'後面加'myclass')。你能否澄清你的問題/縮小你的標準究竟是什麼必須被替換? – 2012-07-24 04:23:45

+0

例如「我希望在以'''''結尾的行上發生的每個'#'和'.'後面添加'.myclass'? (它仍然不能解釋爲什麼'#class1'和'.class2'沒有改變) – 2012-07-24 04:25:01

+0

對不起,我的意思是我想在'#'和','之前添加.myclass只有在逗號後面,謝謝望着它的人 – 2012-07-24 04:32:47

回答

0

[等等]是一個字符類,這意味着它將匹配任何這些字母;所以[^ background]意味着匹配那個詞中的任何字符。同樣,你不需要一個char類來匹配單個字符,如逗號。

編輯:因爲PHP不支持可變長度回顧後,循環每個線,並跳過那些與後臺啓動:

foreach($lines as $line){ 
    if(preg_match("/^\s*background.+\;$/",$line) == 0) 
    { 
     array_push($new, preg_replace("/,\s+#/",", .myclass ",$line)); 
    } 
    else 
    { 
     array_push($new,$line); 
    } 
} 

或類似物。

+0

不,它不會工作,因爲你需要可變長度的後視斷言,它沒有實現。 – 2012-07-24 04:32:41

+0

啊,你說得對。我也在混合一些perl語法。必須編輯。 – 2012-07-24 04:33:09

+0

什麼是'?'和'!'裏面(?<!\ s * background), 和/ g?嗯......我應該看看它,謝謝你! – 2012-07-24 04:35:17

0

我想這是不可能用一個正則表達式解決你的任務。 你需要可變長度的後置斷言來解決它,它們沒有被實現。 但如果他們的解決辦法是這樣的:

/(?<!background:.*)(#[a-zA-Z_0-9]*)/ 

這裏的問題是(?<!background:.*)。你說.*,這意味着這個斷言可以有任何長度。它會繼續工作。

更簡單的解決方案是將任務分成兩部分。

  1. 檢查線background內。
  2. 如果沒有background,請運行preg_replace
+0

非常感謝這個男人!!!! – 2012-07-24 05:40:24

0

「中的‘#’和前只有逗號後添加.myclass‘’」 - >所以你要在,#之間添加.myclass

即無論何時您看到, #您想要它, .myclass #

而我猜你只想影響定義CSS類的行(這就是爲什麼你排除background: ...)。

在這種情況下,我建議以下標準:

「每當你看到,[space]#,把它在給, .myclass #只有在發生這種情況時{結尾的行。」 (或者「只有在發生這種情況的行不會在;中結束」)。

這取決於這樣一個事實,即當您製作CSS選擇器時,您會以{結束該行,並且這些行是您希望影響的唯一行。

然後我會建議更換正則表達式:

/, *#(?=.+\{ *$)/m 

有:

', .myclass #' 

這是如何工作:

, *# : "find a comma followed by 0 or more spaces and then a hash symbol, 
(?=  : FOLLOWED BY: 
    .+ : the rest of the line PLUS 
    \{ *$): an opening curly bracket at the end of the line (possibly spaces between this and the end of the line) 

/m意味着如果$string包含新線,$匹配一行的結尾(與e nd整個字符串$string)。

來講微調正則表達式,大約有here戲(即驗證您的正則表達式的作品第一然後嘗試在PHP,所以如果你有任何問題,你就會知道它是否是一個正則表達式問題或PHP問題)。