12

如何使用 PHP 删除 JS 注释?此问题已更新:2013 年 11 月 4 日并由 Alexander Yancharuk 回答但现在有一个问题。新代码:id = id.replace(/\//g,'');

这是我的例子:

<?php
$output = "
//remove comment
this1 //remove comment
this2 /* remove comment */
this3 /* remove
comment */
this4 /* * * remove
* * * *
comment * * */
this5 http://removecomment.com
id = id.replace(/\//g,''); //do not remove the regex //
";

$output = preg_replace( "/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:)\/\/.*))/", "", $output ); //Yancharuk's code/regex
// "/(?<!\:)\/\/(.*)\\n/ = my oldest code

echo nl2br($output);
?>

我的问题;

  1. this1 行有问题;
  2. //comments 正在工作,但我无法创建代码来删除 /* comment */ 或通过带有换行符的评论

这是最近的输出:




这1 这2
这3
这4 这
5 http://removecomment.com id = id.replace
(/\

4

7 回答 7

21

尝试这个:

$output = "
//remove comment
this1 //remove comment
this2 /* remove comment */
this3 /* remove
comment */
this4 /* * * remove
* * * *
comment * * */
this5 http://removecomment.com
id = id.replace(/\//g,''); //do not remove the regex //
HTTP+'//www.googleadservices.com/pagead/conversion'
";

$pattern = '/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\|\')\/\/.*))/';
$output = preg_replace($pattern, '', $output);

echo nl2br($output);

codepad.org上的结果。

于 2013-10-22T06:34:46.570 回答
8

Alexander Yancharuk 的解决方案几乎是完美的,他只是忘记忽略双引号,导致他的答案在包含代码的 jquery.min.js 上中断:replace(Fb,yb[1]+"//")

请在下面找到更正的版本:

$output = "
//remove comment
this1 //remove comment
this2 /* remove comment */
this3 /* remove
comment */
this4 /* * * remove
* * * *
comment * * */
this5 http://removecomment.com
id = id.replace(/\//g,''); //do not remove the regex //
HTTP+'//www.googleadservices.com/pagead/conversion'
";

$pattern = '/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\|\'|\")\/\/.*))/';
$output = preg_replace($pattern, '', $output);

echo nl2br($output);

我用它在 PHP 中创建了一个基于 Manas Tungare 示例的实时 JS 压缩:http: //manas.tungare.name/software/css-compression-in-php/

<?php

/**
 * On-the-fly JS Compression by A. Heiligtag
 * Based on On-the-fly CSS Compression by  Manas Tungare.
 *
 * In order to minimize the number and size of HTTP requests for JS content,
 * this script combines multiple JS files into a single file and compresses
 * it on-the-fly.
 *
 */
$cssFiles = array(
    //<!-- Bootstrap -->
    // <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    "./js/jquery-1.11.3.min.js",
    // <!-- Bootstrap core JavaScript
    "./js/bootstrap.min.js",
    // <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    "./js/ie10-viewport-bug-workaround.js",

     // <!-- Jasny bootstrap -->
    "./js/jasny-bootstrap.min.js",

    // <!-- color picker : https://github.com/istvan-ujjmeszaros/bootstrap-colorpickersliders / http://www.virtuosoft.eu/code/bootstrap-colorpickersliders/ -->
    // <!-- ‘Polyglot’ Language Switcher 2 : http://www.ixtendo.com/polyglot-language-switcher-2/ -->
    "./js/jquery-polyglot.language.switcher.js"

);

/**
 * Ideally, you wouldn't need to change any code beyond this point.
 */
$buffer = "";
foreach ($cssFiles as $cssFile) {
  $buffer .= file_get_contents($cssFile);
}
// Remove comments
$buffer = preg_replace('/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\|\'|\")\/\/.*))/', '', $buffer);
// Remove space after colons
$buffer = str_replace(': ', ':', $buffer);
// Remove space before equal signs
$buffer = str_replace(' =', '=', $buffer);
// Remove space after equal signs
$buffer = str_replace('= ', '=', $buffer);
// Remove whitespace
$buffer = str_replace(array("\r\n\r\n", "\n\n", "\r\r", '\t', '  ', '    ', '    '), '', $buffer);
// Enable GZip encoding.
ob_start("ob_gzhandler");
// Enable caching
header('Cache-Control: public');
// Expire in one day
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT');
// Set the correct MIME type, because Apache won't set it for us
header("Content-type: application/javascript");
// Write everything out
echo($buffer);
?>
于 2015-08-09T17:45:04.777 回答
2

复杂的正则表达式挂了!!!使用简单的处理数千行

$module = preg_replace('/\/\*[^\/]*\*\//', '', $module);
/*
* remove comments like this 
*/

$module = preg_replace('/\/\*\*((\r\n|\n) \*[^\n]*)+(\r\n|\n) \*\//', '', $module);
/**
 * remove comments like this other method
 */
$module = preg_replace('/\n(\s+)?\/\/[^\n]*/', '', $module);
// remove comments like this
$module = preg_replace('/ (\t| )+/', '', $module); 
//double spaces
$module = preg_replace('/([\n])+/', "$1", $module);
//double newlines
于 2019-01-07T12:41:39.090 回答
1

要删除 JavaScript 注释和 CDATA 块,请(//<![CDATA[ , //]]>)结合 alex 的解决方案https://stackoverflow.com/a/8283600/2910183和 Alexander 的 Yancharuk 解决方案https://stackoverflow.com/a/19510664/2910183

$content = preg_replace('~//<!\[CDATA\[\s*|\s*//\]\]>~', '', $content);
$content = preg_replace('/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\)\/\/[^"\'].*))/', '', $content);
于 2014-06-04T07:59:36.727 回答
1

这是我最好的结果,在第一篇文章之后搜索了很多网站,这个函数很好地适用于 php 中的 javascript 和 css 和 html 内容

function _compress($html){
   //remove comments
   $html = preg_replace('|(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:)\/\/.*))|', '', $html ); //Yancharuk's code/regex

   // remove tabs, spaces, newlines, etc.
   $html = str_replace(array(PHP_EOL, "\t"), '', $html);

   //remove all spaces
   $html = preg_replace('|\s\s+|', ' ', $html);

   return $html;
}
于 2015-04-12T12:51:20.963 回答
0

如果您想从客户端 javascript 代码中删除注释,那么您做错了。

只需使用缩小器。除了删除注释之外,它还将删除无意义的空格并缩短脚本中的所有名称。

例如github:UglifyJS 2

于 2013-10-22T05:59:17.810 回答
-2

我想分享一个我为自己编写的正则表达式 (PHP) 代码片段,它也被用于标记为简单代码的 joomla 的 YIREO sriptmerge 插件中。压缩 javascript 代码并从中删除所有注释。它也适用于 mootools 它速度很快(与其他 PHP 解决方案相比)并且不会损坏它本身的 JavaScript,并且它解决了许多评论删除问题。

If you click on the link below you find a comment removal script in regex. 

这些是 112 行代码,它们一起工作也适用于 mootools 和 Joomla 以及 drupal 和其他 cms 网站。在 800.000 行代码和注释上对其进行了测试。工作正常。这一项还选择了多个括号(abc(/ nn /('/ xvx /'))“//测试行”)和冒号之间的注释并保护它们。23-01-2016..!这是带有注释的代码。!!!!!!

点击这里

我只是为了好玩而测试了这个(var regex=/(ftp|https?):\/\//;alert('hello,world');)和这个 /* foo(); // some comment */和这个:"Python's division: 1 // 2" 这个//"you dope"例子和我的压缩代码不会损坏上面的例子!来自上面的评论:(使用正则表达式的愚蠢解析器会将有效的 JavaScript 代码视为注释!)所以也许你也可以用正则表达式编写不愚蠢的解析器???

如果您发现此脚本的有效 javascript 句子有问题,请随时发表评论。并且任何类型的评论标签组合(或不组合)它不能正确解决..

更新后不再需要测试 800.000 行现在可以正常工作了!

于 2015-01-31T23:31:39.597 回答