PHPページのHTML出力を縮小する方法は?


143

私は、Googleページの速度と同じように、phpページのhtml出力を縮小できるphpスクリプトまたはクラスを探しています。

これどうやってするの?


14
@RakeshSの回答に基づくワンライナー:ob_start(function($b){return preg_replace(['/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s'],['>','<','\\1'],$b);});
Francisco Presencia 2014年

5
@FranciscoPresenciaそれは本当に悪いことです。スクリプトタグ、
ブラッド

彼の回答コメントで言及されているように、それは本当です。適切な構造のために空白が必要なため、タグ<pre><code>タグでは機能しません。ただし、<script>通常は外部、またはインラインである必要がありますが;、厳密に使用することで機能します。@Bradを壊す他のタグはどれですか?他の人のことは考えられませんでした。私は前のコメントの前に素早く汚い方法を追加するべきでした。
フランシスコプレセンシア2015年

回答:


213

CSSとJavaScript

Javascript / CSSファイルを縮小するには、次のリンクを検討してください。https//github.com/mrclay/minify

HTML

ApacheにGZipでHTMLを配信するように指示します。これにより、応答サイズが約70%削減されます。(Apacheを使用する場合、gzipを構成するモジュールはバージョンによって異なります。Apache1.3はmod_gzipを使用し、Apache 2.xはmod_deflateを使用します。)

Accept-Encoding:gzip、deflate

コンテンツのエンコード: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");

?>

54
これは良い機能ですが、PREタグを使用する場合は注意してください。改行が削除される場合があります。
fedmich 2013

2
このコードは、スクリプトの上部または下部のどこに配置する必要がありますか?
jdepypere 2013

8
そのMinifyライブラリのMinify_HTMLクラスを使用することもできます($content = \Minify_HTML::minify($content);インラインコードのjs / cssミニファイアにコールバックを追加することもできます)。github.com/mrclay/minify/blob/master/min/lib/Minify/HTML.php
Barryvdhを

21
これはまた、すべてのステートメントの最後に<script>ない;、または使用するコメントがあるインラインJavaScript(つまり、タグ内)を壊します//
Konstantin Pereiaslov

8
これにより、textarea、pre、input、imgからスペースが削除されます。これにより、インラインJavaScriptも壊れます。誰かがDOM解析でかさばるクラスを使用して満足していない場合、正規表現に基づくこのソリューションはうまく機能します
Peter

28

適切に実行したい場合は、gzipをオンにします。次のようなこともできます:

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

これにより、htmlが1行になり、タブ、改行、コメントがなくなるため、ページサイズの約30%が削除されます。走行距離は異なる場合があります


1
両方を実行すると、さらに必要なバイト数が減少します。
さまよえるナウタ

1
実際に両方を実行することはgzipを実行することと同じです。700kbのページでは、gzipはそれを約400 kbに減らし、preg_replace()は約450 kb(すべてコンテンツによって異なります)はどちらも399 kbのようになります。圧縮
dogmatic69

18
あなたは/<!--(?![if).*?-->/し、それを変更する必要があります-それはまた... IEの条件文を削除しますので、これは、潜在的に危険なことができ
カタイ

3
動作せず、削除しすぎて、コードがめちゃくちゃになります。W3Cが有効になる前は無効でした。
Codebeat

3
残念ながら、それはまた、Google Mapsのより複雑な実装を生成するようなJavascriptコードを破壊します-これはまさに私がそのような関数を必要としていることです。
リッチー2013

19

preg_replace()上記のすべてのソリューションには、単一行コメント、条件付きコメント、およびその他の落とし穴の問題があります。十分にテストされたMinifyプロジェクトを利用することをお勧めします最初から独自の正規表現を作成するのではなくします。

私の場合は、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');

1
あなたのコードはhtmlを1行に入れません
karadayi '18

MinifyプロジェクトFAQの最初の質問を読んでください。TL; DR:それらを無視します。
Andrew

試してみましたが、うまくいきません。私は、私のPHPファイルに<script>タグの間にPHPを埋め込むの<style>タグとJavaScript間のCSS持っている
ジョアン・ピメンテル・フェレイラ

このコードはどこに配置しますか?フッターまたはヘッダーの最後?
フランチェスコ

@francescoこれは、ページの最初のコードです。
Andrew、

19

私はいくつかの縮小版を試してみましたが、それらは削除が少なすぎるか多すぎます。

このコードは、冗長な空白スペースとオプションのHTML(終了)タグを削除します。また、安全に再生され、HTML、JS、CSSを破壊する可能性のあるものは削除されません。

また、コードはZend Frameworkでそれを行う方法を示しています。

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

4
うん、私はそれが一見無意味であることに同意しますが、それはあなたのグーグルランキングに関連するグーグルのページスピードであなたに1つまたは2つの貴重なポイントをあなたに与えることができます。あなたのコードは不要なスペースを取り除くのに最適です。ありがとう:-)
Tschallacka

1
これはうまく機能し、= "/"に問題があったため、「〜([\ r \ n \ t])から/を取り出しましたか?([a-zA-Z0-9] +)= "([a-zA -Z0-9 _ / \\-] +) "([\ r \ n \ t])?〜s '=>' $ 1 $ 2 = $ 3 $ 4 '、// $ 1と$ 4は前に見つかった最初の空白文字を挿入します/属性の後
Asked_io 2016年

よくあることですが、スピードを上げるためだけに空白を削除するのではなく、インラインブロック要素のように、完全に混乱しないようにするためにHTMLを使用する必要があるためです。前後に1つのスペースが必要なもの(たとえば、テキストブロック内の太字の要素)を無視します。
Deji、2016

特定のJquery / Foundationに関する問題が見つかりました...次の行をコメントアウトしない限り:// JSのブロック終了文字のみを含む「空の」行を削除します。次の行と結合(例: "} \ n} \ n </ script>"-> "}} </ script>" // '/} [\ r \ n \ t] + / s' => '} '、//' /} [\ r \ n \ t] +、[\ r \ n \ t] + / s '=>'}、 '、
Ian

1
サーバーサイドキャッシングを使用する場合(私はSmarty V3)、min + gzipは最初の呼び出しを除いて優れたソリューションです。そのため、15回目の呼び出しの後で、サーバー時間に関心があることになります。ルール= 40x15 =(30x15 + 150)しかし、2番目の呼び出しでは、ビジターの方がすでに高速です。
Meloman

6

この仕事は私にとって。

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;
}

5

ドキュメントルートの外部にPHPファイルを作成します。ドキュメントルートが

/var/www/html/

その1レベル上の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/



2

HTML TIDYを調べることができます- //uk.php.net/tidy

これはPHPモジュールとしてインストールでき、完全に有効なHTML / XHTMLマークアップを出力しながら、(正しく、安全に)空白やその他のすべての厄介さを取り除きます。また、コードをクリーンアップします。これは、最初から有効なコードをどれだけ上手に書いているかに応じて、すばらしいことでもひどいことでもあります;-)

さらに、ファイルの先頭で次のコードを使用して出力をgzipできます。

ob_start('ob_gzhandler');

問題は、サイトが共有でホストされ、そのようなモジュールをインストールするためのアクセス権がないことです。
m3tsys 2011年

おそらく、すでにインストールされています。確認phpinfo()...少なくともzlib、を使用できるようにインストールする必要がありますob_gzhandler
Rudi Visser、2011年

もう使ってますif (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start();よね?
m3tsys

2
はい、そうです。else ob_start()パーツは本当に必要ありません。gzipチェックも... ob_gzhandlerブラウザが内部で圧縮方法をサポートしているかどうかを検出します。単に持つだけでob_start('ob_gzhandler');十分です。
Rudi Visser、2011年

余分な解析オーバーヘッドのために、TIDYが他の回答よりも遅くなる可能性はありますか?開発には良いかもしれませんが、実際のソースコードのHTMLエラーを修正できますが、これが本番環境に最適な選択肢であるかどうかは疑問です。
Matt Browne 2013

2

まず第一に、gzipはHtml Minifier以外にも役立ちます。

  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. Apacheを使用すると、mod_gzipを使用できます

2番目:gzip + Html Minificationを使用すると、ファイルサイズを大幅に削減できます!!!

このPHPのHtmlMinifierを作成しました。

composer:から取得できますcomposer require arjanschouten/htmlminifier dev-master

Laravelサービスプロバイダーがあります。Laravelを使用していない場合は、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();

ご覧のとおり、ここで多くのことを拡張でき、さまざまなオプションを渡すことができます。Readmeを確認する使用可能なすべてのオプションををてください。

このHtmlMinifierは完全で安全です。縮小プロセスには3つのステップが必要です。

  1. 重要なコンテンツを一時的なプレースホルダーに置き換えます。
  2. 縮小戦略を実行します。
  3. 元のコンテンツを復元します。

ビューの出力をキャッシュすることをお勧めします。縮小プロセスは1回限りのプロセスでなければなりません。または、例えば間隔ベースでそれを行います。

現時点では明確なベンチマークは作成されていません。ただし、縮小版では、マークアップに基づいてページサイズを5〜25%削減できます。

あなたがあなた自身の戦略を追加したいなら、あなたはaddPlaceholderaddMinifierメソッドを使うことができます。


ライブラリをありがとう。指示には、どのPHPファイルを含める必要があるかが記載されていません。私は最終的にそれを理解しますが、それはおそらくあなたのウェブサイトに追加すべきものです。
ローズウォーター、2015年

まだIlluminate \ Support \ Collectionが必要なようです。これはスタンドアロンのPHPソリューションではありません。
ローズウォーター、2015年

フィードバックをお寄せいただきありがとうございます!それは作曲家パッケージです。Readmeを更新しましたを次のルールでrequire __DIR__ . '/vendor/autoload.php';。このファイルをインクルードすることだけが必要です。これは作曲家によって生成されます!
ArjanSchouten

2

私が持っているのGitHub要旨は縮小化HTML、CSSやJSファイル→にPHPの関数が含まれてい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(); ?>

要旨リンクは404ページにつながる
1111161171159459134

2
リンクを更新しました。
Taufik Nurrohman、

1

ページのすべての新しい行を削除する場合は、次の高速コードを使用します。

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

0

アンドリューに感謝します。これがcakePHPでこれを使用するために何をしたかです:

  1. ダウンロード minify-2.1.7を
  2. ファイルを解凍し、minサブフォルダーをCakeのベンダーフォルダーにコピーします
  3. 次のように、ケーキのビュー/ヘルパーに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. AppControllerで私のヘルパーを有効にしました

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

5 ...ほら!

私の結論:サーバーでapacheのdeflateおよびheadersモジュールが無効になっている場合、圧縮のリクエストでサイズが21%減少し、0.35sプラスされます(この数値は私の場合です)。

しかし、Apacheのモジュールを有効にした場合、圧縮された応答に大きな違いはなく(私には1.3%)、圧縮にかかる時間はsamne(私に0.3秒)です。

それで...なぜ私はそれをしたのですか?'私のプロジェクトのドキュメントがコメント(php、css、js)に含まれているので、私の最終ユーザーはこれを見る必要はありません;)


0

あなたが好きなだけでなくテストされたJava minifier使用することができますHTMLCompressorを使用してそれを呼び出すことによってpassthruexec)。
を使用してコンソールをリダイレクトすることを忘れないでください2>&1

ただし、速度が問題になる場合、これは役に立たない場合があります。静的なphp出力に使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.