3
\$\begingroup\$

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;
}
  1. Do you see any dangers here, perhaps this could ruin some svg files?
  2. Is there something I could do to compress the file even more?
  3. Is there any way to speed this up?
\$\endgroup\$
2
\$\begingroup\$

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.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.