2013-12-08 15 views
0

我需要編輯我的CSS「字符串」並在每個選擇器之前添加#持有人選擇器。例如;用PHP正則表達式編輯CSS文件

我想改變這個CSS字符串;

/* the css file with comments */ 
.header ul, .footer #div, .selector3 a 
{ 
    box-shadow: none; 
    -webkit-box-shadow: none; 
    -moz-box-shadow: none; 
} 

.selector4, .selector5 ul > li, .selector6 a:hover 
{ 
    text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; 
    -moz-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; 
    -webkit-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; 
} 

/* the css file with comments */ 
#holder .header ul, #holder .footer #div, #holder .selector3 a 
{ 
    box-shadow: none; 
    -webkit-box-shadow: none; 
    -moz-box-shadow: none; 
} 

#holder .selector4, #holder .selector5 ul > li, #holder .selector6 a:hover 
{ 
    text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; 
    -moz-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; 
    -webkit-text-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset; 
} 

我已經使用這個正則表達式來縮小字符串,因此你可以忽略的註釋行,它工作正常。

preg_replace('@({)\s+|(\;)\s+|/\*.+?\*\/|\[email protected]', '$1$2 ', $css); 

我正在尋找一個正則表達式方法來做到這一點,但任何其他解決方案也將不勝感激。 在此先感謝。

+0

您是否需要更換*每個*類選擇器?或者只有少數幾個已知的? – brandonscript

+0

有很多差異。選擇器在我的CSS和我必須自定義頁面的特定部分代碼,如#持有人。所以答案是肯定的,我需要替換每個選擇器。 – user2360754

+0

作爲** one **正則表達式將會非常困難。 – cgTag

回答

1

你可以這樣做:

$pat = '~(?>/\*(?>[^*]++|\*(?!/))*+\*/|{[^}]*+})(*SKIP)(?!)|[^\s,{/][^,{/]++~'; 
$css = preg_replace($pat, '#holder $0', $css); 

這樣做是爲了避免大括號內註釋和內容,那麼你可以很容易地找到[^\s,{/][^,{/]++所有選擇。

要做到這一點,你把一組在徵求意見的子模式(即/\*(?>[^*]++|\*(?!/))*+\*/)和大括號內的內容(即{[^}]*+}),那麼你強制模式失敗,並禁止在匹配子回溯。

(*SKIP)(?!)用於此目的。 (*SKIP)禁止在其左側的所有匹配內容中回溯,如果子模式稍後失敗。 (?!)強制子模式失敗(「沒有跟隨任何東西」總是爲false)。