2013-12-12 135 views
0

我正在處理此RegEx以匹配並用其他CSS值替換CSS。 到目前爲止,我有這樣的:如何使RegEx匹配CSS非匹配的部分匹配

$css_new = preg_replace('/('.$definition.'.*?\s'.$property.':)[^;]*([^}]*)/is','$1 '.$value.'$2',$css_temp); 

我的問題是,如果我想替換定義「菜單」的價值觀也得到在「菜單裏」的定義替換的東西。

我正在考慮在某處添加「{」,但我沒有運氣。 我嘗試這樣做:

$css_new = preg_replace('/('.$definition.'{.*?\s'.$property.':)[^;]*([^}]*)/is','$1 '.$value.'$2',$css_temp); 

感謝您的幫助。

回答

0

只想報告我是如何解決這個問題的。 我能夠想出這條線並進行了廣泛的測試。

$css_new = preg_replace('/(.*^'.$definition.'\s{.*?\s'.$property.':)[^;]*([^}]*)/ism','$1 '.$value.'$2',$css_temp); 

如果您發現此行有問題,請告訴我,但我相信這可以解決問題。

1

我假設$definition總是包含整個選擇器。 (請注意,你將它添加到你的正則表達式之前替換你的定義點,否則.menu將匹配smenu以及)

$definition = '.submenu'; 

// no match: 
.menu .submenu 

我還假設CSS是不是完全乾淨(所以雙空格可以發生等)。

.menu .submenu { 

下一個假設是,多個(逗號)分隔的CSS規則是不存在的(否則你將改變超過1條規則):

.menu .submenu, .menu .list { 

那麼這應該工作:(未經過完全測試)

$cleanDefinition = str_replace(array('.', ' '), array('\.', '\s+'), $definition); 
$result = preg_replace('/((?:}|^)\s*'.$cleanDefinition.'\s*{.*'.$property.'\s*:)(.+?)(;.*?})/is', '$1'.$value.'$3', $css_temp); 
+0

非常感謝您的幫助!所有的假設,但最後一個是正確的。此代碼是否可以更改爲更改多個通信分離定義的屬性? – marcnyc