只要你按照你有varname
在該行的結束,每一行包含一個CSS property : value
而已,你可以在模式用正則表達式進行搜索和替換。
如果您想這樣做,請注意新值在PCRE意義上不包含任何newline-ish:\r\n|\n|\x0b|\f|\r|\x85
(非UTF-8模式)。如果你不這樣做,這會破壞你的解析器!
要做到這一點,你可以創建爲圖案的面具,讓你可以再插入VARNAME以後很容易,我通常使用sprintf
爲:
$patternMask =
'~
^# start of line
(\s*[a-z]+:\s*)
# Group 1:
# whitespace (indentation)
# + CSS property and ":"
# + optional whitespace
(.*?) # Group 2: CSS value (to replace)
(\s*/\*\{%s\}\*/\s*)
# Group 3:
# whitespace (after value and before variable)
# + variable comment, %%s is placeholder for it\'s name
$ # end of line
# Pattern Modifiers:
# m:^& $ match begin/end of each line
# x: ignore spaces in pattern and allow comments (#)
~mx'
;
這與評論的正則表達式模式,做成可能與x
-修改。只是讓你理解起來更容易。
重要的一點是多線模式下的m
-修改器。該模式應該適用於每一行,因此它被包含在^
(Begin)和$
(End)中,它將與多行模式下行的開始和結束相匹配。
當您進行替換操作時,組2將被替換,組1和3將被保留。完成後,結果仍將包含變量名稱。
實際的正則表達式,然後通過使用sprintf
和preg_quote
添加適當的引用變量名到其與此面膜建設:
$varName = 'bgColor';
$value = '#f00 url(../images/bg-reg.jpg) repeat-x;';
# create regex pattern based on varname
$pattern = sprintf($patternMask, preg_quote($varName, $patternMask[0]));
$patternMask[0]
是~
因此,如果您的變數名稱將包含~
這將是適當的自動轉義。
搜索模式現在已完成。剩下的就是更換。作爲變量名稱,替換字符串也需要轉義,以不破壞正則表達式(語法錯誤)。此外,如前所述,整個過程需要注意將新字符串保留爲單行,否則下次執行替換操作會使其斷行。因此,爲了防止這種情況,任何換行符將在$value
用一個空格代替,以防止:
# replace characters that will break the pattern with space
$valueFiltered = str_replace(explode('|', "\r\n|\n|\x0b|\f|\r|\x85"), ' ', $value);
然後特殊字符\
和$
將被引用,使他們不會替換模式和干擾替換字符串是建立。這與addcslashes
函數來完成:
# escape $ characters as they have a special meaning in the replace string
$valueEscaped = addcslashes($valueFiltered, '\$');
$replace = sprintf('${1}%s$3', $valueEscaped);
剩下的唯一的事情就是運行更換操作,所以給它ssome CSS前期:
$css = <<<CSS
html,body {
background: #fff url(../images/bg.jpg) repeat-x; /*{bgColor}*/
color: #fff; /*{textColor}*/
}
CSS;
並運行preg_replace
替換:
$newCss = preg_replace($pattern, $replace, $css);
這已經是整件事了。從最初的CSS:
html,body {
background: #fff url(../images/bg.jpg) repeat-x; /*{bgColor}*/
color: #fff; /*{textColor}*/
}
要結果CSS:
html,body {
background: #f00 url(../images/bg-reg.jpg) repeat-x; /*{bgColor}*/
color: #fff; /*{textColor}*/
}
如果你使用preg_replace
的&$count
參數,你可以檢查,如果變量是字符串的一部分:
$newCss = preg_replace($pattern, $replace, $css, -1, $count);
$count
在給出的示例中爲1。
如果您想一次替換多個值,則可以使用數組作爲$pattern
和$replace
以防萬一它有幫助。 $count
仍然是一個整數,所以它可能是有限的使用。
一覽整個代碼:
$css = <<<CSS
html,body {
background: #fff url(../images/bg.jpg) repeat-x; /*{bgColor}*/
color: #fff; /*{textColor}*/
}
CSS;
$patternMask =
'~
^# start of line
(\s*[a-z]+:\s*)
# Group 1:
# whitespace (indentation)
# + CSS property and ":"
# + optional whitespace
(.*?) # Group 2: CSS value (to replace)
(\s*/\*\{%s\}\*/\s*)
# Group 3:
# whitespace (after value and before variable)
# + variable comment, %%s is placeholder for it\'s name
$ # end of line
# Pattern Modifiers:
# m:^& $ match begin/end of each line
# x: ignore spaces in pattern and allow comments (#)
~mx'
;
$varName = 'bgColor';
$value = '#f00 url(../images/bg-reg.jpg) repeat-x;';
# create regex pattern based on varname
$pattern = sprintf($patternMask, preg_quote($varName, $patternMask[0]));
# replace characters that will break the pattern with space
$valueFiltered = str_replace(explode('|', "\r\n|\n|\x0b|\f|\r|\x85"), ' ', $value);
# escape $ characters as they have a special meaning in the replace string
$valueEscaped = addcslashes($valueFiltered, '\$');
$replace = sprintf('${1}%s$3', $valueEscaped);
$newCss = preg_replace($pattern, $replace, $css);
echo $newCss;
向一個具體的問題,你跑?只需在該行末尾重新添加註釋,它應該沒問題。 – hakre 2011-12-18 13:54:14
啊我明白了。在這種情況下,我將如何搜索評論,然後替換整個行? – tctc91 2011-12-18 14:02:02
預期產量是多少?第一行不明確,因爲'bgColor'屬性轉換爲'background-color'。 – 2011-12-18 14:08:59