2014-04-08 66 views
0

我有填充SVG文件上的路徑如下所示:preg_replace函數的正則表達式匹配6個相同的字符

<path fill="#FFFFFF" ... /> 
<path fill="#CCCCCC" ... /> 
<path fill="#DDDDDD" ... /> 

我可以通過替換那些6個以字符的3個相同字符的任何填充稍微降低文件大小,產生:

<path fill="#FFF" ... /> 
<path fill="#CCC" ... /> 
<path fill="#DDD" ... /> 

我不知道怎麼在我的PHP preg_replace的正則表達式將查找此。我想它會像這樣開始:

$fileContent = preg_replace('/fill="#/','',$fileContent); 

請注意,6個相同的字符可以是字母數字,可以是任何顏色,不只是我的例子。

回答

3

試試這個:

$text = <<<EOT 
<path fill="#FFFFFF" ... /> 
<path fill="#CCCCCC" ... /> 
<path fill="#DDDDDD" ... /> 
EOT; 

$text = preg_replace('/fill="#(.)\1{5}/', 'fill="#$1$1$1', $text); 
print "$text\n"; 

這裏(.)捕獲的第一個字符,並使用反向引用\1{5}它會檢查下一個五個字符相同與否。如果是,則用三個$1替換,其中保留正則表達式中使用的值(.)

+1

這是一個很好的答案,我可能會用正則表達式'/ fill =「#([\ da-f])\ 1 {5}/i'來匹配0-9和AF ,不區分大小寫 –

+0

真棒感謝哥們! – Coop

1

嘗試使用back references,例如:

$fileContent = preg_replace('/(fill="#)(.)\2{5}/', '\1\2\2\2', $fileContent); 

這會匹配fill="#XXXXXX任何字符串,並與像fill="#XXX字符串替換它。

但是,十六進制顏色代碼如#FFCC99can also be shortened#FC9。如果你想處理這種情況,以及,你可以嘗試這樣的事:

$fileContent = preg_replace('/(fill="#)(.)\2(.)\3(.)\4/', '\1\2\3\4', $fileContent); 

這將匹配任何字符串像fill="#XXYYZZ,並與像fill="#XYZ字符串替換它。

+0

但我只想匹配像6點相同的字符'補=「#FFFFFF」'不是東西,比如'補=「#F8F8F8」'或'補=「#FFCCAA」' – Coop

+0

@Coop那麼,如果這是一個要求,看到我的更新答案替代。順便說一句,這些模式都不會匹配'fill =「#F8F8F8」'。 –

+0

這似乎是最合理的 –

-1

快速和骯髒的解決辦法是:

$regex = "/#(0{6}|1{6}|...|E{6}|F{6}/"; 

不是最完美的解決方案,但它會完成這項工作。

2

您可以使用:

$s = '<path fill="#FFFFFF" ... />'; 
echo preg_replace('/(fill="#)([0-9A-F])\g{-1}{5}/i', '$1\2\2\2', $s); 
//=> <path fill="#FFF" ... /> 

哪裏\g{-1}是反向引用最近的組。

+1

我以前從來沒有使用過'\ g {-1}',它對我來說是新的,謝謝。 –

+0

我相信這是PCRE功能,雖然還沒有在Javascript上試過。 – anubhava

+1

有趣,閱讀從'\ g'已經,但不是''g {-1}'感謝輸入:)非常好! –