我知道混淆是一个坏主意。但我希望我的所有html代码都有一个很长的单行。所有的html标签都是通过PHP生成的,所以我认为它是可能的。我知道从正则表达式中替换\n\r
,但不知道如何做到这一点。如果我不清楚这是一个例子
$output = '<p>
<div class="title">Hello</div>
</p>';
echo $output;
在源查看器中以<p><div class="title">Hello</div></p>
答案 0 :(得分:46)
也许这个?
$output = str_replace(array("\r\n", "\r"), "\n", $output);
$lines = explode("\n", $output);
$new_lines = array();
foreach ($lines as $i => $line) {
if(!empty($line))
$new_lines[] = trim($line);
}
echo implode($new_lines);
答案 1 :(得分:34)
你可以试试这个。
// Before any output
ob_start();
// End of file
$output = ob_get_clean();
echo preg_replace('/^\s+|\n|\r|\s+$/m', '', $output);
除非我弄乱正则表达式,否则应该捕获所有输出,然后替换所有新行字符以及行末和行开头的所有空格。
如果您已经在变量中收集了所有输出,您当然可以直接使用最后一行并跳过输出缓冲内容:)
答案 2 :(得分:14)
为我工作:
$output = str_replace(array("\r\n", "\r", "\n"), "", $output);
答案 3 :(得分:5)
你可以这样做:
$output = '<p>'.
'<div class="title">Hello</div>'.
'</p>';
这样,$output
将不包含任何行跳转。
这也应该有效:
$output = preg_replace(array('/\r/', '/\n/'), '', $output);
答案 4 :(得分:3)
$output = preg_replace('!\s+!m', ' ', $output);
答案 5 :(得分:1)
这已经得到了很好的解答,但您可以做的不仅仅是修剪每行两端的空格:
<script></script>
代码中的所有文字,并执行与步骤#1 >_<
替换为><
(_ =空格)_>
,<_
和</_
替换为>
,<
和</
(_ =空格)此过程可能会压缩整个HTML文件。这利用了HTML标记内的多个空白文本被解释为一个单独空间的事实。
答案 6 :(得分:0)
这是(据我所测试的)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;
}
答案 7 :(得分:0)
这是上述的改进功能。它增加了文本区域保护,任何标签都保持不变。
我还删除了循环中的strlen
(静态)。
这可能会作为一次通过过滤器运行得更快,以检查任何受保护的部分。对于这样一个小protected_parts
数组,它比循环遍历$str
四次更有效。
这也没有解决:class =&#34; &#34; (=和&#34之间的额外空格)作为标签内的东西。
function MinifyHTML($str) {
$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;
}
答案 8 :(得分:0)
<div>
内的<p>
不能 - 它不符合规范。
如果您不需要将其存储在变量中,可以使用它:
?><div><?php
?><div class="title">Hello</div><?php
?></div><?php