PHP渲染压缩HTML


背景:

优化一下邮件内容(HTML)存储,美滋滋~

使用:

清空一下缓冲区,include进来HTML -渲染,最重要的是压缩哦,正则自己掂量掂量,别把不该干掉的干掉了哈。

<?php

/**
     * 渲染HTML模板
     * 
     * @param  string $template 模板路径 /data/test.html
     * @param  array $params 模板参数
     * @return string 渲染后的HTML字符串
     * @author wystanxu@tencent.com
     * @since 2021-03-17
     * 
     */
    function parseHTML($template = '', $params = array())
    {
        ob_start();//打开输出控制缓冲
        if (!empty($params) && is_array($params)) {
            foreach ($params as $key => $value) {
                $$key = $value;
            }
        }
        include($template);
        $html = ob_get_contents();//返回输出缓冲区的内容
        ob_get_clean(); // ob_get_contents + ob_end_clean // 得到当前缓冲区的内容并删除当前输出缓冲区
        $html = compressHTML($html);
        return $html;
    }

    /**
     * 压缩html
     * 
     * @param  $string  模板名称
     * @author JQ中文网 http://www.jquerycn.cn/a_24864
     */
    function compressHTML($string)
    {
        $string = str_replace("\r\n", '', $string); //清除换行符
        $string = str_replace("\n", '', $string); //清除换行符
        $string = str_replace("\t", '', $string); //清除制表符
        $pattern = array(
            "/> *([^ ]*) *", //去掉注释标记
            "/[\s]+/", //多个空白字符 -- 置为1个空格
            "//", //注释之间的空白字符 -- 置空
            "/\" /", //" 置为"
            "/ \"/", // \"置为\"
        );
        $replace = array(
            ">\\1<",
            " ",
            "",
            "\"",
            "\"",
        );
        return preg_replace($pattern, $replace, $string);
    }

这里仅仅是压缩html和使用ob缓冲区获取渲染的内容;

压缩html的话正则要看的清晰一些别把不该过滤的给过滤掉了;

而ob函数的仅仅是 开启缓冲区 + 关闭缓冲区 + 获取缓冲区的内容; 

很自然而言的认为,上面 ob_get_contents 获取到的是否会拉取到 start 之前的 输出内容,答案是 不会:

<?php

// https://www.php.net/manual/zh/ref.outcontrol.php

echo 123;

ob_start();//打开输出控制缓冲

echo 456;

$html = ob_get_contents();//返回输出缓冲区的内容

ob_get_clean(); // ob_get_contents + ob_end_clean // 得到当前缓冲区的内容并删除当前输出缓冲区

var_dump($html); // 输出string(3) "456"

参考文章:

https://www.hoohack.me/2015/01/24/php-ob_start-function

https://www.php.net/manual/zh/ref.outcontrol.php

相关