【问题标题】:How to minify php html output without removing non empty newlines?如何在不删除非空换行符的情况下缩小 php html 输出?
【发布时间】:2012-10-05 20:20:07
【问题描述】:

如何像谷歌页面速度一样缩小我的 php 页面 html 输出?

例子:

<!DOCTYPE html>
<html>

<head>
<title>Untitled Document</title>

<meta name="description" content="Phasellus rhoncus euismod libero a lacinia. Lorem ipsum dolor sit amet, consectetur adipiscing elit." />

</head>

<body>
<div id="content">
<div id="post-1">
<h1>Phasellus rhoncus euismod libero a lacinia.</h1>
<p>...</p>
</div>

<div id="post-2">
<h1>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
<p>...</p>
</div>

</div>


</body>
</html>

如何使用 php ob_start 这个 html 输出变成这样?

<!DOCTYPE html>
<html>
<head>
<title>Untitled Document</title> 
<meta name="description" content="Phasellus rhoncus euismod libero a lacinia. Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
</head>
<body>
<div id="content">
<div id="post-1">
<h1>Phasellus rhoncus euismod libero a lacinia.</h1>
<p>...</p>
</div>
<div id="post-2">
<h1>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
<p>...</p>
</div>
</div>
</body>
</html>

编辑:

我已经尝试过这段代码(基于 James Pegg 的回答)

function sanitize_output($buffer){
$search = array("\n", "\t");
return preg_replace($search, '', $buffer);}

ob_start("sanitize_output");

但它不起作用。该页面现在是空的。

最终工作代码(基于 W. Kristianto 的回答):

function sanitize_output($buffer){
$buffer = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $buffer);
return $buffer;}

【问题讨论】:

  • 我觉得你的问题很有趣,但是,在现实生活中你应该首先在其他地方进行优化。您的示例代码从 458 到 451 字节(或 gzip 压缩后从 257 到 251 字节)。您添加另一个处理层只是为了减少几个字节。改为查看更小的图像、更少的请求和缓存。
  • 我已经在我的页面上使用了 gzip,但我想知道如何才能完成。前段时间我使用了带有缓存插件(我不记得名字)的wordpress,它能够做到这一点(缩小html代码)。

标签: php html minify


【解决方案1】:
$data = '
<!DOCTYPE html>
<html>

<head>
<title>Untitled Document</title>

<meta name="description" content="Phasellus rhoncus euismod libero a lacinia. Lorem ipsum dolor sit amet, consectetur adipiscing elit." />

</head>

<body>
<div id="content">
<div id="post-1">
<h1>Phasellus rhoncus euismod libero a lacinia.</h1>
<p>...</p>
</div>

<div id="post-2">
<h1>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
<p>...</p>
</div>

</div>


</body>
</html>';

echo "<pre>";
echo htmlentities(preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $data));
echo "</pre>";

【讨论】:

  • 我使用了没有 htmlentities 的代码。只有正则表达式,现在它可以工作了。
【解决方案2】:

只需删除仅包含 \r\n\r\n 的每一行。

这很有用:How do I remove blank lines from text in PHP?

【讨论】:

    【解决方案3】:

    您可以像这样取出所有新行和标签:

    <?php
    // Start Output Bugger
    ob_start();
    
    // Start HTML Output
    ?>
    <!DOCTYPE html>
    <html>
    
    <head>
    <title>Untitled Document</title>
    
    <meta name="description" content="Phasellus rhoncus euismod libero a lacinia. Lorem ipsum dolor sit amet, consectetur adipiscing elit." />
    
    </head>
    
    <body>
    <div id="content">
    <div id="post-1">
    <h1>Phasellus rhoncus euismod libero a lacinia.</h1>
    <p>...</p>
    </div>
    
    <div id="post-2">
    <h1>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
    <p>...</p>
    </div>
    
    </div>
    
    
    </body>
    </html>
    
    <?php
    
    // Save Output bugger as a variable
    $html = ob_get_clean();
    
    //Array of characters to replace
    $strings = Array("\n", "\t");
    
    //Strip out new lines and tabs
    $html = str_replace($strings, '', $html);
    
    //Echo minified content
    echo $html;
    ?>
    

    希望有帮助!

    【讨论】:

    • 您需要在示例中使用 str_replace(),而不是 preg_replace()。然后它将按预期工作。你不能给 preg_replace 一个正则表达式数组,但是你可以给 str_replace() 一个字符串数组来搜索。使用正则表达式时也要小心,在这种情况下它们可能会变慢。
    【解决方案4】:

    尝试使用一些js library,有时它很有用

    【讨论】:

    • 谢谢,但我不想缩小/优化 js 代码。我要优化html代码。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2013-08-30
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多