我的SVG文件中包含填充路径,如下所示:
<path fill="#FFFFFF" ... />
<path fill="#CCCCCC" ... />
<path fill="#DDDDDD" ... />
我可以通过用3个字符替换6个相同字符的任何填充来略微减小文件大小,从而产生:
<path fill="#FFF" ... />
<path fill="#CCC" ... />
<path fill="#DDD" ... />
我不确定我的php preg_replace
中的正则表达式是如何寻找的。我想它会像这样开始:
$fileContent = preg_replace('/fill="#/','',$fileContent);
请注意,6个相同的字符可以是字母数字,可以是任何颜色,而不仅仅是我的例子。
答案 0 :(得分: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 :(得分: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}
是对最近一组的反向引用。
答案 2 :(得分:1)
尝试使用back references,例如:
$fileContent = preg_replace('/(fill="#)(.)\2{5}/', '\1\2\2\2', $fileContent);
这将匹配fill="#XXXXXX
之类的任何字符串,并将其替换为fill="#XXX
之类的字符串。
但是,十六进制颜色代码如#FFCC99
can also be shortened到#FC9
。如果您也想处理这种情况,可以尝试这样的事情:
$fileContent = preg_replace('/(fill="#)(.)\2(.)\3(.)\4/', '\1\2\3\4', $fileContent);
这将匹配fill="#XXYYZZ
之类的任何字符串,并将其替换为fill="#XYZ
之类的字符串。
答案 3 :(得分:-1)
快速而肮脏的解决方案是:
$regex = "/#(0{6}|1{6}|...|E{6}|F{6}/";
不是最优雅的解决方案,但它可以完成工作。