使用PHP从源代码中删除空格和换行符

时间:2014-02-21 18:10:37

标签: php html regex

我在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_pa​​rts也没有工作,因为我的textareas也被缩小了,所以其中的所有内容都压缩成一行...

有关修复的任何想法?我也找不到替代品,而不是实现缓存,gzipping和其他我不想要的功能。我纯粹想要一个简单的解决方案来剥离空格,换行符和注释,就是这样。

1 个答案:

答案 0 :(得分:0)

更新2014/02/25(已故):

这是另一种解决方法。而不是触摸$protected_parts我只是在最后添加另一个替换操作,在每</a>之后添加一个空格 - 再次成为一种解决方法,但这不应该搞砸任何原始的可操作性,并且这次的惩罚只是每个锚标记后的一个空格字符,不错。这是:http://phpfiddle.org/main/code/5qj-13z

更新2014/02/25:

我将'</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扩展或库。使用其他人的开源代码是程序员可以产生的最强大的巫术。 :)