使用正则表达式通过 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的主要内容,如果未能解决你的问题,请参考以下文章