如何缩小页面 html 输出?

我正在寻找一个 PHP 脚本或类,可以缩小我的 PHP 页面 html 输出像谷歌网页速度做。

我怎么能这么做?

192671 次浏览

如果你想正确地使用 gzip,你也可以这样做:

$this->output = preg_replace(
array(
'/ {2,}/',
'/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s'
),
array(
' ',
''
),
$this->output
);

通过将 html 变成一行,没有标签,没有新行,没有注释,这样可以消除30% 的页面大小。里程数可能不同

您可以查看 HTML TIDY-http://uk.php.net/tidy

它可以作为一个 PHP 模块安装,可以(正确、安全地)去除空格和所有其他脏东西,同时仍然输出完全有效的 HTML/XHTML 标记。它还会清理您的代码,这可能是一件好事,也可能是一件可怕的事,这取决于您最初编写有效代码的能力; -)

另外,您可以在文件的开头使用以下代码 gzip 输出:

ob_start('ob_gzhandler');

你可以看看这些类: https://code.google.com/p/minify/source/browse/?name=master#git%2fmin%2flib%2fminify ,可以找到 html/css/js 缩小类。

你也可以试试这个: http://code.google.com/p/htmlcompressor/

祝你好运

CSS 和 Javascript

考虑以下链接来缩小 Javascript/CSS 文件: https://github.com/mrclay/minify

超文本标示语言

告诉 Apache 用 GZip 交付 HTML-这通常会减少大约70% 的响应大小。(如果使用 Apache,配置 gzip 的模块取决于您的版本: Apache 1.3使用 mod _ gzip,而 Apache 2.x 使用 mod _ flate。)

接受-编码: gzip,flate

内容编码: gzip

使用 以下片段通过 ob _ start 的缓冲区从 HTML 中删除空格:

<?php


function sanitize_output($buffer) {


$search = array(
'/\>[^\S ]+/s',     // strip whitespaces after tags, except space
'/[^\S ]+\</s',     // strip whitespaces before tags, except space
'/(\s)+/s',         // shorten multiple whitespace sequences
'/<!--(.|\s)*?-->/' // Remove HTML comments
);


$replace = array(
'>',
'<',
'\\1',
''
);


$buffer = preg_replace($search, $replace, $buffer);


return $buffer;
}


ob_start("sanitize_output");


?>

以上所有的 preg_replace()解决方案都存在单行注释、条件注释和其他陷阱的问题。我建议利用经过良好测试的 缩小项目,而不是从头开始创建自己的正则表达式。

在我的例子中,我将下面的代码放在 PHP 页面的顶部以缩小它:

function sanitize_output($buffer) {
require_once('min/lib/Minify/HTML.php');
require_once('min/lib/Minify/CSS.php');
require_once('min/lib/JSMin.php');
$buffer = Minify_HTML::minify($buffer, array(
'cssMinifier' => array('Minify_CSS', 'minify'),
'jsMinifier' => array('JSMin', 'minify')
));
return $buffer;
}
ob_start('sanitize_output');

我已经试了几个微型,他们要么删除太少或太多。

这段代码删除了多余的空格和可选的 HTML (结束)标记。此外,它玩它的安全,并没有删除任何可能破坏 HTML,JS 或 CSS 的潜在。

代码还显示了如何在 Zend 框架中实现这一点:

class Application_Plugin_Minify extends Zend_Controller_Plugin_Abstract {


public function dispatchLoopShutdown() {
$response = $this->getResponse();
$body = $response->getBody(); //actually returns both HEAD and BODY


//remove redundant (white-space) characters
$replace = array(
//remove tabs before and after HTML tags
'/\>[^\S ]+/s'   => '>',
'/[^\S ]+\</s'   => '<',
//shorten multiple whitespace sequences; keep new-line characters because they matter in JS!!!
'/([\t ])+/s'  => ' ',
//remove leading and trailing spaces
'/^([\t ])+/m' => '',
'/([\t ])+$/m' => '',
// remove JS line comments (simple only); do NOT remove lines containing URL (e.g. 'src="http://server.com/"')!!!
'~//[a-zA-Z0-9 ]+$~m' => '',
//remove empty lines (sequence of line-end and white-space characters)
'/[\r\n]+([\t ]?[\r\n]+)+/s'  => "\n",
//remove empty lines (between HTML tags); cannot remove just any line-end characters because in inline JS they can matter!
'/\>[\r\n\t ]+\</s'    => '><',
//remove "empty" lines containing only JS's block end character; join with next line (e.g. "}\n}\n</script>" --> "}}</script>"
'/}[\r\n\t ]+/s'  => '}',
'/}[\r\n\t ]+,[\r\n\t ]+/s'  => '},',
//remove new-line after JS's function or condition start; join with next line
'/\)[\r\n\t ]?{[\r\n\t ]+/s'  => '){',
'/,[\r\n\t ]?{[\r\n\t ]+/s'  => ',{',
//remove new-line after JS's line end (only most obvious and safe cases)
'/\),[\r\n\t ]+/s'  => '),',
//remove quotes from HTML attributes that does not contain spaces; keep quotes around URLs!
'~([\r\n\t ])?([a-zA-Z0-9]+)="([a-zA-Z0-9_/\\-]+)"([\r\n\t ])?~s' => '$1$2=$3$4', //$1 and $4 insert first white-space character found before/after attribute
);
$body = preg_replace(array_keys($replace), array_values($replace), $body);


//remove optional ending tags (see http://www.w3.org/TR/html5/syntax.html#syntax-tag-omission )
$remove = array(
'</option>', '</li>', '</dt>', '</dd>', '</tr>', '</th>', '</td>'
);
$body = str_ireplace($remove, '', $body);


$response->setBody($body);
}
}

但是请注意,当使用 gZip 压缩时,你的代码得到的压缩比任何缩减都要多得多,因此结合缩减和 gZip 是毫无意义的,因为下载节省的时间会因为缩减而损失,而且节省的时间也最少。

以下是我的研究结果(通过3G 网络下载) :

 Original HTML:        150kB       180ms download
gZipped HTML:          24kB        40ms
minified HTML:        120kB       150ms download + 150ms minification
min+gzip HTML:         22kB        30ms download + 150ms minification

多亏了 安德鲁。 下面是 a 在 cakePHP 中如何使用它:

  1. 下载 缩小 -2.1.7
  2. 解压文件并将 min 子文件夹复制到蛋糕的供应商文件夹
  3. 在 cake’s View/Helper 中创建 MinifyCodeHelper.php,如下所示:

    App::import('Vendor/min/lib/Minify/', 'HTML');
    App::import('Vendor/min/lib/Minify/', 'CommentPreserver');
    App::import('Vendor/min/lib/Minify/CSS/', 'Compressor');
    App::import('Vendor/min/lib/Minify/', 'CSS');
    App::import('Vendor/min/lib/', 'JSMin');
    class MinifyCodeHelper extends Helper {
    public function afterRenderFile($file, $data) {
    if( Configure::read('debug') < 1 ) //works only e production mode
    $data = Minify_HTML::minify($data, array(
    'cssMinifier' => array('Minify_CSS', 'minify'),
    'jsMinifier' => array('JSMin', 'minify')
    ));
    return $data;
    }
    }
    
  4. Enabled my Helper in AppController

    public $helpers = array ('Html','...','MinifyCode');

5... Voila!

My conclusion: If apache's deflate and headers modules is disabled in your server your gain is 21% less size and 0.35s plus in request to compress (this numbers was in my case).

But if you had enable apache's modules the compressed response has no significant difference (1.3% to me) and the time to compress is the samne (0.3s to me).

So... why did I do that? 'couse my project's doc is all in comments (php, css and js) and my final user dont need to see this ;)

首先,gzip 可以帮助你比一个 HTML 缩小器更多

  1. 使用 nginx :

    gzip on;
    gzip_disable "msie6";
    
    
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
  2. With apache you can use mod_gzip

Second: with gzip + Html Minification you can reduce the file size drastically!!!

I've created this HtmlMinifier for PHP.

You can retrieve it through composer: composer require arjanschouten/htmlminifier dev-master.

There is a Laravel service provider. If you're not using Laravel you can use it from PHP.

// create a minify context which will be used through the minification process
$context = new MinifyContext(new PlaceholderContainer());
// save the html contents in the context
$context->setContents('<html>My html...</html>');
$minify = new Minify();
// start the process and give the context with it as parameter
$context = $minify->run($context);


// $context now contains the minified version
$minifiedContents = $context->getContents();

正如你所看到的,你可以在这里扩展很多东西,你可以传递不同的选项。检查自述查看所有可用选项。

这个 缩小机是完整和安全的。它需要3个步骤的缩小过程:

  1. 用占位符替换临时关键内容。
  2. 运行缩小策略。
  3. 还原原始内容。

我建议您缓存视图的输出。缩小过程应该是一个一次性的过程。或者这样做,例如基于时间间隔。

当时没有创建明确的基准测试。然而,缩小器可以减少5-25% 的页面大小的基础上,您的标记!

如果你想添加你自己的策略,你可以使用 addPlaceholderaddMinifier方法。

在文档根目录之外创建一个 PHP 文件

/var/www/html/

在它之上创建一个名为 minify.php 的文件

/var/www/minify.php

将下面的 PHP 代码复制粘贴到其中

<?php
function minify_output($buffer){
$search = array('/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s');
$replace = array('>','<','\\1');
if (preg_match("/\<html/i",$buffer) == 1 && preg_match("/\<\/html\>/i",$buffer) == 1) {
$buffer = preg_replace($search, $replace, $buffer);
}
return $buffer;
}
ob_start("minify_output");?>

保存 minify.php 文件并打开 php.ini 文件。如果是专有服务器/VPS 搜索以下选项,在共享主机上使用自定义 php.ini 添加它。

auto_prepend_file = /var/www/minify.php

参考资料: http://websistent.com/how-to-use-php-to-minify-html-output/

我有一个 GitHub要点包含 PHP 函数,以缩小 HTML,CSS 和 JS 文件 & rarr; https://gist.github.com/taufik-nurrohman/d7b310dea3b33e4732c0

下面介绍如何使用输出缓冲区动态缩小 HTML 输出:

<?php


include 'path/to/php-html-css-js-minifier.php';


ob_start('minify_html');


?>


<!-- HTML code goes here ... -->


<?php echo ob_get_clean(); ?>

您可以通过使用 passthru(exec)调用像 压缩器这样经过良好测试的 Java 小型化程序。
记住使用 2>&1重定向控制台

然而,如果速度是一个问题,这可能没有什么用处。我用它来处理静态 PHP 输出

如果要删除页面中的所有新行,请使用以下快速代码:

ob_start(function($b){
if(strpos($b, "<html")!==false) {
return str_replace(PHP_EOL,"",$b);
} else {return $b;}
});

这对我有用。

function minify_html($html)
{
$search = array(
'/(\n|^)(\x20+|\t)/',
'/(\n|^)\/\/(.*?)(\n|$)/',
'/\n/',
'/\<\!--.*?-->/',
'/(\x20+|\t)/', # Delete multispace (Without \n)
'/\>\s+\</', # strip whitespaces between tags
'/(\"|\')\s+\>/', # strip whitespaces between quotation ("') and end tags
'/=\s+(\"|\')/'); # strip whitespaces between = "'


$replace = array(
"\n",
"\n",
" ",
"",
" ",
"><",
"$1>",
"=$1");


$html = preg_replace($search,$replace,$html);
return $html;
}

最简单的方法可能是使用 Strtr和删除空格。 也就是说,不要使用 javascript,因为它可能会破坏您的代码。

$html_minify = fn($html) => strtr($html, [PHP_EOL => '', "\t" => '', '  ' => '', '< ' => '<', '> ' => '>']);


echo $html_minify(<<<HTML
<li class="flex--item">
<a href="#"
class="-marketing-link js-gps-track js-products-menu"
aria-controls="products-popover"
data-controller="s-popover"
data-action="s-popover#toggle"
data-s-popover-placement="bottom"
data-s-popover-toggle-class="is-selected"
data-gps-track="top_nav.products.click({location:2, destination:1})"
data-ga="[&quot;top navigation&quot;,&quot;products menu click&quot;,null,null,null]">
Products
</a>
</li>
HTML);


// Response (echo): <li class="flex--item"><a href="#"class="-marketing-link js-gps-track js-products-menu"aria-controls="products-popover"data-controller="s-popover"data-action="s-popover#toggle"data-s-popover-placement="bottom"data-s-popover-toggle-class="is-selected"data-gps-track="top_nav.products.click({location:2, destination:1})"data-ga="[&quot;top navigation&quot;,&quot;products menu click&quot;,null,null,null]">Products</a></li>

这是我在 php apache wordpress + w 总缓存 + amp 把它放在 php 页面的顶部

<?Php
if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')){
ob_start ('ob_html_compress');
}else{
ob_start();
}
function ob_html_compress($buf) {
$search = array('/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s', '/<!--(.|\s)*?-->/');
$replace = array('>', '<', '\\1', '');
$buf = preg_replace($search, $replace, $buf);
return $buf;


return str_replace(array("\n","\r","\t"),'',$buf);
}
?>

然后剩下的 php 或者 html 的东西