Способ вытянуть html код в одну строку при помощи PHP

Другой способ вытягивания html кода. Приведенный ниже код обходить служебные теги и обрабатывает только html разметку. Код надо добавить в файл function.php

Каждый вебмастер или заказчик сайта стремится, чтобы его сайт загружался быстро и не тормозил. Одним из способов, который рекомендует использовать Гугл при оптимизации сайта, это сокращение веб документа. Делается это простым удалением из кода ненужных комментариев, пробелов, переходов на новую строку и так далее.

Не так давно я написал скрипт, который помогает вытянуть html код в одну строку. Однако, в том коде есть свои недостатки.

Он прекрасно справляется со своей задачей и быстрее других функций выполняет задачу. Но, если вы используете в своих статьях тег pre, то такой код также вытягивается в одну строку и перестает быть наглядным. А в некоторых случаях вообще перестает работать.

Поэтому я решил рассказать про другой способ вытягивания. Приведенный ниже код обходить служебные теги и обрабатывает только html разметку.

Код надо добавить в файл function.php

//Код в одну строку
class Compress_HTML {
    protected $compress_css = true;
    protected $compress_js = false;
    protected $info_comment = true;
    protected $remove_comments = true;
    protected $html;
    public function __construct($html)
    {if (!empty($html)){$this->parseHTML($html);}}
    public function __toString()
    {return $this->html;}
    protected function bottomComment($raw, $compressed){
        $raw = strlen($raw);
        $compressed = strlen($compressed);
        $savings = ($raw-$compressed) / $raw * 100;
        $savings = round($savings, 2);
        return '<!--HTML compressed, size saved '.$savings.'%. From '.$raw.' bytes, now '.$compressed.' bytes-->';}
    protected function minifyHTML($html){
        $pattern = '/<(?<script>script).*?<\/script\s*>|<(?<style>style).*?<\/style\s*>|<!(?<comment>--).*?-->|<(?<tag>[\/\w.:-]*)(?:".*?"|\'.*?\'|[^\'">]+)*>|(?<text>((<[^!\/\w.:-])?[^<]*)+)|/si';
        preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
        $overriding = false;
        $raw_tag = false;
        $html = '';
        foreach ($matches as $token) {
            $tag = (isset($token['tag'])) ? strtolower($token['tag']) : null;
            $content = $token[0];
            if (is_null($tag)){
                if ( !empty($token['script']) ){$strip = $this->compress_js;             }
                else if ( !empty($token['style']) )
                {$strip = $this->compress_css;               }
                else if ($content == '<!--wp-html-compression no compression-->')
                {$overriding = !$overriding; continue;}
                else if ($this->remove_comments)
                {if (!$overriding && $raw_tag != 'textarea'){
                    $content = preg_replace('/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', '', $content);}}
            } else{
                if ($tag == 'pre' || $tag == 'textarea'){$raw_tag = $tag;}
                else if ($tag == '/pre' || $tag == '/textarea')
                {$raw_tag = false;}
                else{if ($raw_tag || $overriding){$strip = false;}else{$strip = true;
                    $content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content);
                    $content = str_replace(' />', '/>', $content);}}}
            if ($strip){$content = $this->removeWhiteSpace($content);}
            $html .= $content;}
        return $html;}
    public function parseHTML($html) {
        $this->html = $this->minifyHTML($html);
        if ($this->info_comment){$this->html .= "\n" . $this->bottomComment($html, $this->html);}}
    protected function removeWhiteSpace($str) {
        $str = str_replace("\t", ' ', $str);
        $str = str_replace("\n",  '', $str);
        $str = str_replace("\r",  '', $str);
        while (stristr($str, '  ')){$str = str_replace('  ', ' ', $str);}
        return $str;}
}
function wp_html_compression_finish($html){return new Compress_HTML($html);}
function wp_html_compression_start(){ob_start('wp_html_compression_finish');}
add_action('get_header', 'wp_html_compression_start');
Этот материал впервые был опубликован 7 октября 2018 года. Актуальность информации подтверждена 16 января 2024 году.