Minify HTML/PHP

前端 未结 3 1028
广开言路
广开言路 2020-12-18 03:53

I\'m using gzip to compress my html/php files along with js/css/etc. This reduces the payload quite nicely but I also want to \'minify\' my markup of both .html and .php pag

3条回答
  •  不思量自难忘°
    2020-12-18 04:42

    I have created 3 simple functions that will probably need to be optimized, but they do their job, they are part of a bigger class that I use to format code, dates, values, etc...:

    to use it simply call:

    echo format::minify_html($html_output);
    

    here is the code (still in beta, but so far haven't had many issues with it)

     $text,
                                    'output_info' => 'compiled_code',//($returnErrors ? 'errors' : 'compiled_code'),
                                    'output_format' => 'text',
                                    'compilation_level' => 'SIMPLE_OPTIMIZATIONS',//'ADVANCED_OPTIMIZATIONS',//'SIMPLE_OPTIMIZATIONS'
                                ), null, '&');
                    $URL            = 'http://closure-compiler.appspot.com/compile';
                    $allowUrlFopen  = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen'));
                    if($allowUrlFopen){
                        $contents = file_get_contents($URL, false, stream_context_create(array(
                                'http'          => array(
                                    'method'        => 'POST',
                                    'header'        => 'Content-type: application/x-www-form-urlencoded',
                                    'content'       => $post_text,
                                    'max_redirects' => 0,
                                    'timeout'       => 15,
                                )
                        )));
                    }elseif(defined('CURLOPT_POST')) {
                        $ch = curl_init($URL);
                        curl_setopt($ch, CURLOPT_POST, true);
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_text);
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
                        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
                        $contents = curl_exec($ch);
                        curl_close($ch);
                    } else {
                        //"Could not make HTTP request: allow_url_open is false and cURL not available"
                        $contents = $text;
                    }
                    if($contents==false || (trim($contents)=='' && $text!='') || strtolower(substr(trim($contents),0,5))=='error' || strlen($contents)<=50){
                        //No HTTP response from server or empty response or error
                        $contents = $text;
                    }
                }
                if(trim($contents)!=''){
                    $contents = trim($contents);
                    $f = fopen($file_cache, 'w');
                    fwrite($f, $contents);
                    fclose($f);
                }
            } else {
                touch($file_cache);     //in the future I will add a timetout to the cache
                $contents = file_get_contents($file_cache);
            }
            return $contents;
        }
        static function minify_html($text){
            if(isset($_GET['no_mini'])){
                return $text;
            }
            $file_cache     = strtolower(md5($text));
            $folder         = TMPPATH.'tmp_files'.DIRECTORY_SEPARATOR.substr($file_cache,0,2).DIRECTORY_SEPARATOR;
            if(!is_dir($folder))            @mkdir($folder, 0766, true);
            if(!is_dir($folder)){
                echo 'Impossible to create the cache folder:'.$folder;
                return 1;
            }
            $file_cache     = $folder.$file_cache.'_content.html';
            if(!file_exists($file_cache)){
                //get CSS and save it
                $search_css = '/<\s*style\b[^>]*>(.*?)<\s*\/style>/is';
                $ret = preg_match_all($search_css, $text, $tmps);
                $t_css = array();
                if($ret!==false && $ret>0){
                    foreach($tmps as $k=>$v){
                        if($k>0){
                            foreach($v as $kk=>$vv){
                                $t_css[] = $vv;
                            }
                        }
                    }
                }
                $css = format::minify_css(implode('\n', $t_css));
    
    /*
                //get external JS and save it
                $search_js_ext = '/<\s*script\b.*?src=\s*[\'|"]([^\'|"]*)[^>]*>\s*<\s*\/script>/i';
                $ret = preg_match_all($search_js_ext, $text, $tmps);
                $t_js = array();
                if($ret!==false && $ret>0){
                    foreach($tmps as $k=>$v){
                        if($k>0){
                            foreach($v as $kk=>$vv){
                                $t_js[] = $vv;
                            }
                        }
                    }
                }
                $js_ext = $t_js;
    */
                //get inline JS and save it
                $search_js_ext  = '/<\s*script\b.*?src=\s*[\'|"]([^\'|"]*)[^>]*>\s*<\s*\/script>/i';
                $search_js      = '/<\s*script\b[^>]*>(.*?)<\s*\/script>/is';
                $ret            = preg_match_all($search_js, $text, $tmps);
                $t_js           = array();
                $js_ext         = array();
                if($ret!==false && $ret>0){
                    foreach($tmps as $k=>$v){
                        if($k==0){
                            //let's check if we have a souce (src="")
                            foreach($v as $kk=>$vv){
                                if($vv!=''){
                                    $ret = preg_match_all($search_js_ext, $vv, $ttmps);
                                    if($ret!==false && $ret>0){
                                        foreach($ttmps[1] as $kkk=>$vvv){
                                            $js_ext[] = $vvv;
                                        }
                                    }
                                }
                            }
                        } else {
                            foreach($v as $kk=>$vv){
                                if($vv!=''){
                                    $t_js[] = $vv;
                                }
                            }
                        }
                    }
                }
                $js = format::minify_js(implode('\n', $t_js));
    
                //get inline noscript and save it
                $search_no_js = '/<\s*noscript\b[^>]*>(.*?)<\s*\/noscript>/is';
                $ret = preg_match_all($search_no_js, $text, $tmps);
                $t_js = array();
                if($ret!==false && $ret>0){
                    foreach($tmps as $k=>$v){
                        if($k>0){
                            foreach($v as $kk=>$vv){
                                $t_js[] = $vv;
                            }
                        }
                    }
                }
                $no_js = implode('\n', $t_js);
    
                //remove CSS and JS
                $search = array(
                    $search_js_ext,
                    $search_css,
                    $search_js,
                    $search_no_js,
                    '/\>[^\S ]+/s', //strip whitespaces after tags, except space
                    '/[^\S ]+\',
                    '<',
                    '\\1',
                );
                $buffer = preg_replace($search, $replace, $text);
    
                $append = '';
                //add CSS and JS at the bottom
                if(is_array($js_ext) && count($js_ext)>0){
                    foreach($js_ext as $k=>$v){
                        $append .= '';
                    }
                }
                if($css!='')        $append .= '';
                if($js!=''){
                    //remove weird '\n' strings
                    $js = preg_replace('/[\s]*\\\n/', "\n", $js);
                    $append .= '';
                }
                if($no_js!='')      $append .= '';
                $buffer = preg_replace('/(.*)(<\s*\/\s*body\s*>)(.*)/','\\1'.$append.'\\2\\3', $buffer);
                if(trim($buffer)!=''){
                    $f = fopen($file_cache, 'w');
                    fwrite($f, trim($buffer));
                    fclose($f);
                }
            } else {
                touch($file_cache);     //in the future I will add a timetout to the cache
                $buffer = file_get_contents($file_cache);
            }
    
            return $buffer;
        }
    
    }
    ?>
    

提交回复
热议问题