删除html源代码中的所有换行符

那么我知道混淆是一个坏主意。 但是我希望我所有的HTML代码都能在一条长长的单行内完成。 所有的html标签都是通过PHP生成的,所以我认为它是可能的。 我知道从正则expression式中replace\n\r ,但不知道如何做到这一点。 如果我不清楚这里是一个例子

 $output = '<p> <div class="title">Hello</div> </p>'; echo $output; 

要在源代码查看器中查看<p><div class="title">Hello</div></p>

也许这个?

 $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); 

你可以试试这个。

 // Before any output ob_start(); // End of file $output = ob_get_clean(); echo preg_replace('/^\s+|\n|\r|\s+$/m', '', $output); 

这应该,除非我搞砸了正则expression式,捕获所有输出,然后replace所有新的行字符以及在行尾的所有空白。

如果你已经把所有的输出都收集在一个variables中,你当然可以直接使用最后一行并跳过输出缓冲的东西:)

为我工作:

 $output = str_replace(array("\r\n", "\r", "\n"), "", $output); 

你可以做 :

 $output = '<p>'. '<div class="title">Hello</div>'. '</p>'; 

这样, $output将不包含任何行跳转。

这也应该工作:

 $output = preg_replace(array('/\r/', '/\n/'), '', $output); 
 $output = preg_replace('!\s+!m', ' ', $output); 

这已经得到了很好的回答,但是您可以在每行的两端修剪空格:

  1. 首先提取引号内的所有文本(您不想触摸这些文本),用带有序列号的标记进行replace,将序列号存储为文本
  2. 提取<script></script>标签中的所有文本,并执行与步骤#1相同的操作
  3. 用空格replace所有的空格(包括\ n,\ r)
  4. 用1个空格replace全部> 1个空间序列
  5. replace全部>_<>< (_ =空格)
  6. 将所有_><_</_replace为><</ (_ =空格)
  7. 将标记replace为实际的文本

此过程可能会压缩整个HTML文件。 这利用了HTML标签内的多个空白文本被解释为单个空间的事实。

这是一个(据我testing)执行司徒锺的指示。 我并不完全相信第五,但无论如何也包括在内。

把你想保护的东西放在protected_pa​​rts数组中。 做到这一点,以便你想要他们的保护。 如果起始位和结束位不同(就像在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; } 

这是上述function的改进。 它增加了文本区域保护,而且任何标签都保持不变。

我也删除了循环中的strlen (它的静态)。

这可能会作为一个单通filter检查任何受保护的部分运行得更快。 对于这样一个小的protected_parts数组来说,要比循环遍历$str四次更高效。

这也不能解决:class =“”(=和“之间的空格)作为标签内的东西。

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

你不能在<p> <div><div> – 它不是专用的。

如果你不需要把它存储在一个variables中,你可以使用这个:

 ?><div><?php ?><div class="title">Hello</div><?php ?></div><?php