从html源中删除所有换行符

时间:2011-03-10 10:44:46

标签: php html obfuscation whitespace line-breaks

我知道混淆是一个坏主意。但我希望我的所有html代码都有一个很长的单行。所有的html标签都是通过PHP生成的,所以我认为它是可能的。我知道从正则表达式中替换\n\r,但不知道如何做到这一点。如果我不清楚这是一个例子

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

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

进行查看

9 个答案:

答案 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)

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

  1. 首先提取引号内的所有文本(您不想触摸它们),使用带有序列号的标记替换,使用文本存储序列号
  2. 提取<script></script>代码中的所有文字,并执行与步骤#1
  3. 相同的操作
  4. 用空格
  5. 替换所有空格(包括\ n,\ r)
  6. 将所有&gt; 1个空格序列替换为1个空格
  7. 将所有>_<替换为><(_ =空格)
  8. 将所有_><_</_替换为><</(_ =空格)
  9. 将标记替换为实际文本
  10. 此过程可能会压缩整个HTML文件。这利用了HTML标记内的多个空白文本被解释为一个单独空间的事实。

答案 6 :(得分:0)

这是(据我所测试的)Stephen Chung指示的工作实施。我并不完全相信第五,但无论如何都把它包括在内。

将您要保护的内容放在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;
}

答案 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