2012-04-24 28 views
1

我正在使用str_replace清理CSS輸出,但需要忽略具有定義的開始和結束的某些字符串塊。PHP忽略來自str_replace的字符串塊

忽略任何開頭:

@media blah(this can be any value) { 

內容忽略:

.class { 
    property: value; 
    } 

,結尾是:

}/*ends*/ 

,做str_replace函數該塊之外時,而不是:

.otherclass {property:value;} 

PHP:

$output = str_replace("{", "{\n", $output); 
$output = str_replace("}", "}\n", $output); 

的原因是@media塊需要這已經是格式正確適當的縮進,而不應通過str_replace函數觸及這簡單的回讀行:

.otherclass { 
    property:value; 
    } 

將如何你用PHP說它?

感謝

+2

即時通訊這是格式化文件的一種奇怪的方法。看看正則表達式,更多的靈活性......或者將整個文件讀入數組並掃描整個數組。如果您遇到開始標籤'{'縮進,如果您發現'@ media'跳過等...另外,看到這個線程http://stackoverflow.com/questions/1376958/linux-automated-code-formatting-php-javascript-html-css-mysql – Alex 2012-04-24 04:23:40

+0

其動態聚合和提取的CSS,這就是爲什麼他們有不同的格式CSS代碼塊,所以IDE不在這裏。基於設置定義的自定義輸入,其大部分格式化想要忽略的塊,以及一些外部CSS文件的副本,並作爲壓縮的不可讀版本附加到單個文件中,並與該自定義輸入一起使用。現在我需要將這些聚合/壓縮版本處理爲更易讀的CSS代碼塊,同時忽略某些@media塊。謝謝 – swan 2012-04-24 04:41:22

回答

1
$string = 
"@media blah(this can be any value) { 
.class { 
    property: value; 
    } 
}/*ends*/ 

.otherclass {property:value;} 

.otherclass {property:value;} 

@media blah(this can be any value) { 
.class { 
    property: value; 
    } 
}/*ends*/ 

.otherclass {property:value;} 

.otherclass {property:value;}"; 

$arr = explode("\r", $string); 

$ignore_block = false; 
for ($i = 0; $i < count($arr); $i++) 
{ 
    if (strstr($arr[$i], '@media')) 
     $ignore_block = true; 
    elseif (strstr($arr[$i-1], '/*ends*/')) 
     $ignore_block = false; 

    if ($ignore_block == false) 
    { 
     $arr[$i] = str_replace("{", "{\n\t", $arr[$i]); 
     $arr[$i] = str_replace("}", "\n}\n", $arr[$i]); 
    } 
} 
file_put_contents("test.txt", implode("\n", $arr)); 

正則表達式是行不通的,因爲回顧後不允許變長。嘗試並遍歷該文件。

+0

謝謝。幾乎可以工作,除了Notice:Undefined offset:-1 – swan 2012-04-24 06:18:27

+0

對,你應該檢查'$ i-1'進行初始迭代。 – Jack 2012-04-24 06:46:18

1

我也認爲,正則表達式去,因爲他們給你更多的靈活性的方式。

我想天真的解決方案是首先從輸出源中獲取所有這些事件,然後在其餘代碼上使用str_replace,然後將其放回。也可能嘗試通過代碼行後,只能運行str_replace

同樣,你最好的機會是正則表達式。您要查找的似乎是的preg_replace,告訴它不要被@media

參考匹配任何跟隨前:

1

正則表達式不能計數,所以他們不是一般適合解析(這是你在做什麼)。也就是說,除非您可以限制輸入格式超過整套有效CSS,否則您可能會發現某些情況不能按預期工作。

您也可以嘗試完全解析CSS並使用規則遍歷生成的CSS樹以指定輸出數據的方式。有顯然是CSS解析庫的位置:

http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html

+1

PCRE(由PHP的'preg_ *'函數使用)可以「計數」(我在這裏假設你指的是遞歸,平衡像括號'{'和'}'; **所有**正則表達式可以*計數*: '。{3,14}')。當然,遞歸不是「常規」的,PCRE也不是,但它肯定是一個有效的令牌匹配工具。 – eyelidlessness 2012-04-24 05:56:59

+0

對不起,是的,我的意思是有用的遞歸計數。當然支持重複計數(theres +,*,?,{num}和{min,max})。但我不確定平衡匹配在這裏有幫助。 – 2012-04-24 06:55:17