PHP minify函数似乎破坏了内联JS?

时间:2016-01-05 18:38:30

标签: javascript php minify

我有以下缩小功能:

public static function minify($buffer)
{
    $search = array(
        '/\>[^\S ]+/s',
        '/[^\S ]+\</s',
        '/(\s)+/s'
    );
    $replace = array(
        '>',
        '<',
        '\\1'
    );
    $buffer = preg_replace($search, $replace, $buffer);
    return $buffer;
}

此函数与ob_start()一起使用,以缩小我的html输出。该功能取自此处:https://stackoverflow.com/a/6225706/4601581

这个函数似乎破坏了我的一些JS。示例:单击按钮执行某些JS:

<button type="button" class="btn btn-<?= Config::$ELEMENT_COLOR ?> btn-block" onclick="addLastInput(<?= $mask->getId() ?>)">Do it</button>

我给addLastInput的$id只是一个数字,取自$mask->getId()

我也有这个小JS代码来填充一些数据数组:

<script>lastSubmissionData[<?=$mask->getId()?>] = '<?=json_encode($lastSubmissionData)?>';</script>

最后我的JS函数实际上我想用我给定的param(id)和数据数组执行:

function addLastInput(maskId) {
        var data = lastSubmissionData[maskId];
        for (var i = 0; i < data.length; i++) {
            // TODO
        }
    }

每当我只加载页面时,它只会在Chrome控制台中告诉我Uncaught SyntaxError: Unexpected end of input。每当我这样做而不使用minify函数并完全取消ob_start()时,它就可以正常工作,我可以使用它。

结论:minify函数似乎制动我的内联JS,因为对链接SO答案的评论表明。问题:我该如何解决这个问题?我甚至用Google搜索了其他缩小解决方案:https://gist.github.com/tovic/d7b310dea3b33e4732c0

所有这些似乎都无法打破我的网站。什么是最好的解决方案,让我使用我的JS代码并仍然缩小我的html输出?

1 个答案:

答案 0 :(得分:1)

请勿使用此minify()功能。它坏了。

此函数最终会删除内联Javascript代码中一些语义上有意义的换行符,例如出现在单行注释末尾的换行符。 (例如,它将您的示例Javascript函数转换为以{ // TODO } }结尾的单行。)

此函数也会破坏一些HTML结构。特别是,它会破坏<pre>标记的内容,因为它不会认识到空格在该上下文中是重要的。

(顺便提一句,这两个警告都是在你从这个代码中得到这个代码的高度评价的评论中提到的!)