preg_replace正则表达式匹配6个相同的字符

时间:2014-04-08 16:48:04

标签: php html xml regex svg

我的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个相同的字符可以是字母数字,可以是任何颜色,而不仅仅是我的例子。

4 个答案:

答案 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}/";

不是最优雅的解决方案,但它可以完成工作。