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

时间:2018-06-23 18:07:19

标签: javascript php regex minify

有人会建议我有关JS缩小的问题吗?我尝试创建它,但是没有成功。我们将在示例中向您显示:https://code.jquery.com/jquery-3.3.1.js

我想要

  1. 删除所有注释,除了http和https或字符串内
  2. 将代码合并为一行
  3. 删除所有不必要的空格

我已经尝试了许多来自Internet的示例,这始终是一个错误。我什至没有发现任何缩小器都做到了没有错误,所以我想编写一个简单的缩小器。我不想使用任何插件。我只想要一个干净的正则表达式。

您能否尝试尽可能缩小此示例?无论是空格,评论还是其他改进或诡计?

到目前为止,我已经拥有了,它也不起作用

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

3 个答案:

答案 0 :(得分:0)

好吧,如果要使用正则表达式,则需要多个表达式:

  1. 多行注释

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

  2. 单行注释:

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

  3. 空白:

    ^\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;
?>

答案 1 :(得分:0)

这可能不是理想的答案,但是小型服务器会实时缩小。设置并自动自动提供绿色锁定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

答案 2 :(得分:-1)

这是一个PHP示例,它清除注释并将它们全部放在一行中。

<?php
$str = <<<EOT
/*
 * Simple javascript function 
 * that writes a square of slashes
 */
function writeSlashes(rows, columns)  {

   for (row = 1; row < rows; row++ ) 
   {
      // The columns
      for ( col = 1; col < columns; col++ )      {
         s = (Math.floor((Math.random() * 2) % 2)) ? "╱" : "╲"; //Randomizing it
         document.write(s);
      }
      document.writeln("<br>");  
    }
}

document.body.innerHTML = "";
document.writeln('<br/><a href="http://www.foo.bar?test"> foo.bar </a><br/><br/>');
writeSlashes(20,20);
EOT;

$re1 = '@ 
  (\/\*[\s\S]*?\*\/\s*) # slash-star comments
| (\s+//.*$)            # whitespaces before forward slashes till end of line
| (^\s+)                # whitespaces at the start of a line
| (?<=[),;:?{}\[\]=<>*%+\-])(\s+) # whitespaces after specific characters
| (\s+)(?=[(,;:?{}\[\]=<>*%+\-])  # whitespaces before specific characters
| [\r\n]+(?!\w)         # next line characters not followed by a word character
@mx';

$result = preg_replace($re1, '', $str);

# remaining multiple whitespaces or next line character to one space
$re2 = '/\s{2,}|[\r\n]+/';
$result = preg_replace($re2,' ', $result);

echo htmlentities($result);

结果:

function writeSlashes(rows,columns){for(row=1;row<rows;row++){for( col=1;col<columns;col++){s=(Math.floor((Math.random()*2)%2))?"╱":"╲";document.write(s);}document.writeln("<br>");}}document.body.innerHTML="";document.writeln('<br/><a href="http://www.foo.bar?test">foo.bar</a><br/><br/>');writeSlashes(20,20);

但是这种方法无法与真正的minify lib相提并论,后者可以将长变量名和函数名替换为短名。