I wrote something to "compress" svg files. The svg files I am using often have comments and empty <g>
tags, and I want to remove them. My main goal is not the speed of the compression, but the size of the compressed svg file.
Here is an example svg file: https://image.flaticon.com/icons/svg/222/222436.svg
And here is the code I am using:
public function compress($svg)
{
$svg = preg_replace('/<!--.*-->/', '', $svg);
$svg = preg_replace('/<g>[\n\r\s]*<\/g>/', '', $svg);
$svg = preg_replace('/\n/', ' ', $svg);
$svg = preg_replace('/\t/', ' ', $svg);
$svg = preg_replace('/\s\s+/', ' ', $svg);
$svg = str_replace('> <', '><', $svg);
$svg = str_replace(';"', '"', $svg);
return $svg;
}
- Do you see any dangers here, perhaps this could ruin some svg files?
- Is there something I could do to compress the file even more?
- Is there any way to speed this up?
-
1\$\begingroup\$ You code does not account for multiline comments (for eg: hastebin.com/idetufocat.xml) \$\endgroup\$hjpotter92– hjpotter922017年04月22日 05:53:13 +00:00Commented Apr 22, 2017 at 5:53
1 Answer 1
SVG is structured data and should therefore not require regex to work with it. I would suggest that you work with either an XML or SVG-specific library in PHP which would let you parse in the input SVG, remove any unwanted nodes and then render it back out.
Here is a starting point for common PHP tools for working with XML that should be able to do what you want.
This also looks like a library that could meet your needs.