删除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);
这已经得到了很好的回答,但是您可以在每行的两端修剪空格:
- 首先提取引号内的所有文本(您不想触摸这些文本),用带有序列号的标记进行replace,将序列号存储为文本
- 提取
<script></script>
标签中的所有文本,并执行与步骤#1相同的操作 - 用空格replace所有的空格(包括\ n,\ r)
- 用1个空格replace全部> 1个空间序列
- replace全部
>_<
用><
(_ =空格) - 将所有
_>
,<_
和</_
replace为>
,<
和</
(_ =空格) - 将标记replace为实际的文本
此过程可能会压缩整个HTML文件。 这利用了HTML标签内的多个空白文本被解释为单个空间的事实。
这是一个(据我testing)执行司徒锺的指示。 我并不完全相信第五,但无论如何也包括在内。
把你想保护的东西放在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; }
这是上述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