一个简单的正则表达式搜索和替换在PHP中缩小/压缩javascript?

tru*_*ktr 7 javascript php compression minify

你可以在php中发布正则表达式搜索和替换来缩小/压缩javascript吗?

例如,这是一个简单的CSS

  header('Content-type: text/css');
  ob_start("compress");
  function compress($buffer) {
    /* remove comments */
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
    /* remove tabs, spaces, newlines, etc. */
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $buffer);
    return $buffer;
  }

  /* put CSS here */

  ob_end_flush();
Run Code Online (Sandbox Code Playgroud)

这是html的一个:

<?php
/* Minify All Output - based on the search and replace regexes. */
function sanitize_output($buffer)
{
    $search = array(
        '/\>[^\S ]+/s', //strip whitespaces after tags, except space
        '/[^\S ]+\</s', //strip whitespaces before tags, except space
        '/(\s)+/s'  // shorten multiple whitespace sequences
        );
    $replace = array(
        '>',
        '<',
        '\\1'
        );
  $buffer = preg_replace($search, $replace, $buffer);
    return $buffer;
}
ob_start("sanitize_output");
?>
<html>...</html>
Run Code Online (Sandbox Code Playgroud)

但是对于javascript来说呢?

Lan*_*ane 5

用于缩小/压缩 javascript 的简单正则表达式不太可能存在于任何地方。这可能有几个很好的原因,但这里有几个原因:

换行符和分号 好的 javascript 压缩器会删除所有额外的换行符,但是因为 javascript 引擎在每个语句的末尾都不需要分号,所以除非它足够复杂以观察和处理不同的编码风格,否则压缩器很容易破坏这些代码。

动态语言构造 许多可用的优秀 javascript 缩小器也会更改变量和函数的名称以缩小代码。例如,在您的文件中被调用 12 次的名为“strip_white_space”的函数可能会被重命名为简单的“a”,以便在您的缩小代码中节省 192 个字符。除非您的文件有很多注释和/或空格,否则大部分文件大小节省将来自于这些优化。

不幸的是,这比一个简单的正则表达式应该尝试处理的要复杂得多。假设你做一些简单的事情:

var length = 12, height = 15;
    // other code that uses these length and height values

var arr = [1, 2, 3, 4];
for (i = (arr.length - 1); i >= 0; --i) {
    //loop code
}
Run Code Online (Sandbox Code Playgroud)

这都是有效的代码。但是,压缩器如何知道要替换什么?第一个“长度”前面有“var”(但不是必须的),但“高度”前面只有一个逗号。如果缩小器足够聪明,可以正确替换第一个“长度”,那么当用作数组的属性时,它必须知道不更改单词“长度”有多聪明?如果您定义了一个 javascript 对象,其中您专门定义了一个“长度”属性并使用相同的点符号引用它,它会变得更加复杂。

非正则表达式选项有几个项目可以使用更复杂的解决方案来解决这个问题,而不仅仅是一个简单的正则表达式,但其中许多项目并没有尝试更改变量名称,所以我仍然坚持使用Dean Edwards 的 packerDouglas Crockford 的 JSMin或类似于YUI Compressor

Douglas Crockford 的 JSMin 的 PHP 实现

https://github.com/mrclay/minify