src/EventListener/MinifyHTMLListener.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  4. use Minify_HTML;
  5. class MinifyHTMLListener
  6. {
  7.     public function onKernelResponse(ResponseEvent $event)
  8.     {
  9.         $response $event->getResponse();
  10.         $content $response->getContent();
  11.         if (strpos($content'<html') !== false || strpos($content'</html>') !== false) {
  12.             $cleanedHtml $this->cleanJavascripts($content);
  13.             $cleanedHtml Minify_HTML::minify($cleanedHtml);
  14.             $cleanedHtml $this->cleanHTML($cleanedHtml);
  15.             $response->setContent($cleanedHtml);
  16.         }
  17.     }
  18.     private function cleanHTML($content)
  19.     {
  20.         $placeholders = [];
  21.         // Remplacer temporairement les contenus <input> et <textarea>
  22.         $content preg_replace_callback(
  23.             '~(<input[^>]*>|<textarea[^>]*>.*?</textarea>|<pre[^>]*>.*?</pre>|<code[^>]*>.*?</code>)~is',
  24.             function($matches) use (&$placeholders) {
  25.                 $placeholder 'PLACEHOLDER_' uniqid() . '_PLACEHOLDER';
  26.                 $placeholders[$placeholder] = $matches[0];
  27.                 return $placeholder;
  28.             },
  29.             $content
  30.         );
  31.         // Supprime les commentaires
  32.         $content preg_replace('/<!--.*?-->/ms'''$content);
  33.         // Supprime les espaces blancs répétés et les sauts de ligne
  34.         $content preg_replace('/\s+/ms'' '$content);
  35.         // Supprime les espaces autour des balises
  36.         $content preg_replace('/> </ms''><'$content);
  37.         // Restaurer les contenus <input> et <textarea> originaux
  38.         foreach ($placeholders as $placeholder => $originalContent) {
  39.             $content str_replace($placeholder$originalContent$content);
  40.         }
  41.         return $content;
  42.     }
  43.     private function cleanJavascripts($htmlContent)
  44.     {
  45.         $placeholders = [];
  46.         // Remplacer temporairement les contenus <input> et <textarea>
  47.         $htmlContent preg_replace_callback(
  48.             '~(<input[^>]*>|<textarea[^>]*>.*?</textarea>|<pre[^>]*>.*?</pre>|<code[^>]*>.*?</code>)~is',
  49.             function($matches) use (&$placeholders) {
  50.                 $placeholder 'PLACEHOLDER_' uniqid() . '_PLACEHOLDER';
  51.                 $placeholders[$placeholder] = $matches[0];
  52.                 return $placeholder;
  53.             },
  54.             $htmlContent
  55.         );
  56.         // Votre traitement précédent pour les scripts
  57.         $content preg_replace_callback(
  58.             '~<script\b(.*?)>(.*?)<\/script>~is',
  59.             function($matches) {
  60.                 $scriptAttributes $matches[1];
  61.                 $scriptContent $matches[2];
  62.                 // Supprimer les commentaires unilignes (//) mais éviter de supprimer les URLs
  63.                 $scriptContent preg_replace('~(?<!\:|[^ ])//[^\n\r]*[\n\r]~'""$scriptContent);
  64.                 // Supprimer les commentaires multilignes (/* ... */)
  65.                 $scriptContent preg_replace('~\/\*.*?\*\/~s'''$scriptContent);
  66.                 return '<script' $scriptAttributes '>' $scriptContent '</script>';
  67.             },
  68.             $htmlContent
  69.         );
  70.         // Supprime les espaces superflus après et avant les balises
  71.         $content preg_replace('~>\s+<~''><'$content);
  72.         // Restaurer les contenus <input> et <textarea> originaux
  73.         foreach ($placeholders as $placeholder => $originalContent) {
  74.             $content str_replace($placeholder$originalContent$content);
  75.         }
  76.         return $content;
  77.     }
  78. }