这是一个(据我测试)实现了Stephen Chung的指令的工作版本。我对第五点并不完全信服,但还是包括了它。
将您想要保护的内容放入protected_parts数组中。按照您想要保护它们的顺序进行操作。如果起始位和结束位不同(如HTML标记),请使用逗号分隔它们。
此外,我不知道这是否是最优化的方法,但它对我有效,并且似乎相当快速。请随意改进等(如果您这样做,请告诉我!)
function MinifyHTML($str) {
$protected_parts = array("<pre>,</pre>", "\"", "'");
$extracted_values = array();
$i = 0;
foreach ($protected_parts as $part) {
$finished = false;
$search_offset = 0;
$first_offset = 0;
$startend = explode(",", $part);
if (count($startend) == 1) { $startend[1] = $startend[0]; }
while (!$finished) {
$first_offset = strpos($str, $startend[0], $search_offset);
if ($first_offset === false) { $finished = true; }
else {
$search_offset = strpos($str, $startend[1], $first_offset + strlen($startend[0]));
$extracted_values[$i] = substr($str, $first_offset + strlen($startend[0]), $search_offset - $first_offset - strlen($startend[0]));
$str = substr($str, 0, $first_offset + strlen($startend[0]))."$#".$i."$".substr($str, $search_offset);
$search_offset += strlen($startend[1]) + strlen((string)$i) + 3 - strlen($extracted_values[$i]);
$i++;
}
}
}
$str = preg_replace("/\s/", " ", $str);
$str = preg_replace("/\s{2,}/", " ", $str);
$str = str_replace("> <", "><", $str);
$str = str_replace(" >", ">", $str);
$str = str_replace("< ", "<", $str);
$str = str_replace("</ ", "</", $str);
for ($i = count($extracted_values); $i >= 0; $i--) {
$str = str_replace("$#".$i."$", $extracted_values[$i], $str);
}
return $str;
}
\n
、\r
、\t
和空格。 - acmwhitespace:pre
的元素,应该怎么办? - Gordonwhitespace:pre
是 CSS 声明,除了是<pre>
和<code>
的默认呈现模式之外,我认为没有好的解决方案。如果您想节省带宽并且每天不提供数百万个页面,则可能通过在 Web 服务器上进行 gzip 压缩来节省足够的带宽。 - Gordon