我在PHP应用程序中使用以下函数来从页面源中删除空格和换行符。
这是基于我在Stack Overflow上阅读的一些例子,有一些修改来处理JS和HTML注释。 注意:我没有使用现有的库,因为我想要一些简单的东西而没有其他人包含的所有附加功能,并且使用这些代码我可以对剥离的内容进行细粒度的控制。 < / p>
protected function MinifyHTML($str) {
$str = preg_replace("/(?<!\S)\/\/\s*[^\r\n]*/", "", $str); // strip JS/CSS comments
$str = preg_replace("/<!--(.*)-->/Uis", "", $str); // strip HTML comments
$protected_parts = array('<pre>,</pre>','<textarea>,</textarea>','<,>');
$extracted_values = array();
$i = 0;
foreach ($protected_parts as $part) {
$finished = false;
$search_offset = $first_offset = 0;
$end_offset = 1;
$startend = explode(',', $part);
if (count($startend) === 1) $startend[1] = $startend[0];
$len0 = strlen($startend[0]); $len1 = strlen($startend[1]);
while ($finished === false) {
$first_offset = strpos($str, $startend[0], $search_offset);
if ($first_offset === false) $finished = true;
else {
$search_offset = strpos($str, $startend[1], $first_offset + $len0);
$extracted_values[$i] = substr($str, $first_offset + $len0, $search_offset - $first_offset - $len0);
$str = substr($str, 0, $first_offset + $len0).'$$#'.$i.'$$'.substr($str, $search_offset);
$search_offset += $len1 + strlen((string)$i) + 5 - strlen($extracted_values[$i]);
++$i;
}
}
}
$str = preg_replace("/\s/", " ", $str);
$str = preg_replace("/\s{2,}/", " ", $str);
$replace = array('> <'=>'><', ' >'=>'>','< '=>'<','</ '=>'</');
$str = str_replace(array_keys($replace), array_values($replace), $str);
for ($d = 0; $d < $i; ++$d)
$str = str_replace('$$#'.$d.'$$', $extracted_values[$d], $str);
return $str;
}
但是,如果我得到的情况如下:
<a href="">Link</a> <a href="">Link</a>
它将删除两个锚标记之间的空格。
我已将'</a> <a'
添加到$protected_parts
以试图阻止此操作,但它仍会消除它们之间的空间。所以我最终在源代码中找到<a href="">Link</a><a href="">Link</a>
,这不是我想要的。
同样的情况也发生在:
<p>This is <span class="">some</span> <span class="">styled</span> text.</p>
似乎protected_parts也没有工作,因为我的textareas也被缩小了,所以其中的所有内容都压缩成一行...
有关修复的任何想法?我也找不到替代品,而不是实现缓存,gzipping和其他我不想要的功能。我纯粹想要一个简单的解决方案来剥离空格,换行符和注释,就是这样。
答案 0 :(得分:0)
这是另一种解决方法。而不是触摸$protected_parts
我只是在最后添加另一个替换操作,在每</a>
之后添加一个空格 - 再次成为一种解决方法,但这不应该搞砸任何原始的可操作性,并且这次的惩罚只是每个锚标记后的一个空格字符,不错。这是:http://phpfiddle.org/main/code/5qj-13z
我将'</a> '
添加到$protected_parts
并且它不会删除空格。我把它扔进了phpfiddle,http://phpfiddle.org/lite/code/dms-cud。这只是几行synethetic仿真HTML的解决方法......我不确定你的函数中运行的是什么类型的有机代码。显然,这种解决方法也不是普遍的解决方案。 击>
我将 '</a>',' <a ',
添加到$protected_parts
并且它不会删除空格。我把它扔到了here, http://phpfiddle.org/lite/code/ztz-5hf上的phpfiddle。
你的功能对我来说很可怕,但我喜欢一些基本功能,比如剥离HTML,JS和CSS评论。我仍然建议使用apache扩展或库。使用其他人的开源代码是程序员可以产生的最强大的巫术。 :)