使用正则表达式通过 PHP 缩小 JS

Posted

技术标签:

【中文标题】使用正则表达式通过 PHP 缩小 JS【英文标题】:Minify JS via PHP using regex 【发布时间】:2018-12-02 20:51:15 【问题描述】:

有人会告诉我关于 JS 缩小的问题吗?我尝试创建它,但没有成功。我们将通过示例向您展示:https://code.jquery.com/jquery-3.3.1.js

我想要

    删除除 http & https 或内部字符串之外的所有 cmets 将代码合并为一行 删除所有不必要的空格

我尝试了很多网上的例子,一直都是错误的。甚至我发现的任何缩小器都没有出错,所以我想编写一个简单的自己的缩小器。我不想使用任何插件。我只想要一个干净的正则表达式。

你能尽量缩小这个例子吗?无论是空间、cmets 还是其他一些改进或诡计?

到目前为止我有这个,但它也不起作用

    '(\/\/[^\n\]*[\n\r]+)' => ''
    '/\/\*[\s\S]*?\*\//' => ''
    '#[\r\n]+#' => ''
    '/ 2,/' => ''

【问题讨论】:

这不是我想用正则表达式解决的问题(参见Now You Have Two Problems)。 那么你对有效的 JS 缩小有什么建议?我尝试了很多,但没有任何效果 离题工具请求。但是JShrink 应该可以胜任。 那么是不是有机会用正则表达式来做到这一点?只是通过一些插件? Github 搜索:minify javascript [php]:最佳结果:github.com/matthiasmullie/minify 一个 CSS 和 JavaScript 压缩器,在 PHP 中。删除空格,去除 cmets,合并文件。问题解决了吗? 【参考方案1】:

这可能不是想要的答案,但球童服务器会即时进行缩小。它也很容易设置和自动提供绿锁 https。

示例 Caddyfile,带有 cors、缩小、日志记录、gzip 压缩,通过 php。

mysite.com 
    root ./mysitefolder/
    gzip
    log ../mysite.log
    minify /
    cors
    fastcgi / /var/run/php/php7.2-fpm.sock 
        ext .php
        split.php
        index index.php
    

https://caddyserver.com/docs/http.minify

【讨论】:

我看着它,但我不明白。你能在php中写一个脚本如何使用它吗?当我在 localhost 上执行此操作时,我也必须将其安装在服务器上,对吗? 好的,我想通了,但是在 caddy 中设置 php 不起作用。我在 windows 上有 localhost,你能帮忙启用 PHP 支持吗? 不知道 windows,但我看到了这个:github.com/caddyserver/examples/tree/master/winphp。尝试将 fastcgi 行替换为 c:\path\to\php\php-cgi.exe 并且路径中的反斜杠反斜杠是问题的根源。【参考方案2】:

好吧,如果你想用正则表达式来做,你需要多个表达式:

    多行 cmets

    \Q/*\E[\s\S]+?\Q*/\E

    单行cmets:

    (?:http|ftp)s?://(*SKIP)(*FAIL)|//.+

    空格:

    ^\s+|\R\s*


在 PHP 中(显然你不需要命名你的键,只是为了冗长):
<?php

$url = "https://code.jquery.com/jquery-3.3.1.js";
$data = file_get_contents($url);

$expressions = array(
    'MULTILINE_COMMENT'     => '\Q/*\E[\s\S]+?\Q*/\E',
    'SINGLELINE_COMMENT'    => '(?:http|ftp)s?://(*SKIP)(*FAIL)|//.+',
    'WHITESPACE'            => '^\s+|\R\s*'
);

foreach ($expressions as $key => $expr) 
    $data = preg_replace('~'.$expr.'~m', '', $data);


echo $data;
?>

【讨论】:

我在使用控制台时遇到错误:Uncaught SyntaxError: Unexpected end of input ... 我在实验中也收到了这个错误 如果字符串中有 cmets,这将不起作用。例如,您的第一个正则表达式删除了"This is /*a commment*/ inside a string" 中的注释,因此console.log("This is /*a commment*/ inside a string") 在被缩小之前和之后不会有相同的行为。您需要检查 cmets(以及您要更改的其他内容)是否在字符串中,这很复杂。 如果字符串中有双斜杠,这也不起作用。例如:console.log('this is //in-line comment in js.');.【参考方案3】:
<?php   
 function sanitize_output($buffer) 
      $search = array(
          '/\>[^\S ]+/s',  
          '/[^\S ]+\</s',  
          '/(\s)+/s',
          '#[\r\n]+#'       
      );
      $replace = array(
          '>',
          '<',
          '\\1',
          ''
      );
      $buffer = preg_replace($search, $replace, $buffer);
      return $buffer;
    
    ob_start("sanitize_output");

在 header.php 的顶部包含这个

【讨论】:

以上是关于使用正则表达式通过 PHP 缩小 JS的主要内容,如果未能解决你的问题,请参考以下文章

JS和PHP的正则表达式的区别

PHP正则表达式的使用技巧

JS之正则表达式

PHP正则表达式函数总结

一个规则正则表达式的 nginx 多个位置

php正则表达式不匹配中文怎么写