REGEX:如何使用PHP代码从javascripts中删除注释

Sam*_*Sam 2 javascript php regex preg-replace pattern-matching

我将所有javascriupt组合成一个整齐的文件,以降低http请求!我坚持删除评论/* comments */// comments.我的水平远远低于缩小或解析的东西.我知道如何制作通心粉串.任何比这更复杂的东西,你在我的电脑或厨房里都找不到,所以:

同时将它合并到一个文件,我想删除所有评论.
什么是正确的正则表达式?

<?php
header('Content-type: text/javascript');    
$offset = 60 * 60 * 24; // Cache for a day
header ('Cache-Control: max-age=' . $offset . ', must-revalidate');
header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT');

ob_start("compress");
function compress($buffer) {

# NOT SURE, not all new lines are removed??
# remove tabs, spaces, newlines, etc.
$buffer = str_replace(array("\r\n", "\r", "\t", '  ', '    '), '', $buffer);  

# WORKS !!!
# remove comments / XXXXXXX
$buffer = preg_replace('(// .+)', '', $buffer);

######################################################################## 
# !! STUCK HERE !! OUTPUT FILE LOOKS OK BUT WEBSITE DOESNT LOAD OK IF THIS IS ON
# remove comments / * XXX  (enters etc) XXXX  * /
# $buffer = preg_replace('#/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*/#s', '', $buffer);
########################################################################        

return $buffer;
}

include('../file1.js');
include('../file2.js');  
ob_end_flush();
?>
Run Code Online (Sandbox Code Playgroud)

如果它能捕获并删除以下内容会很棒:

/* XXXX */

/* 
  XXXX
  XXXX
*/
Run Code Online (Sandbox Code Playgroud)

就这样!无法使用正如我所使用的正则表达式甚至使用这个令人难以置信的工具,我发现正确的匹配是:

RegExp: /\/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*\//gs
pattern: \/\*(?:.(?!/)|[^\*](?=/)|(?<!\*)/)*\*\/
flags: gs
Run Code Online (Sandbox Code Playgroud)

http://gskinner.com/RegExr/

bco*_*sca 7

使用正则表达式不是删除Javascript注释的最有效方法.你需要一个字符串解析器和minifier.请参阅http://razorsharpcode.blogspot.com/2010/02/lightweight-javascript-and-css.html

如果您坚持使用正则表达式模式,请考虑如何解析这个不包含Javascript注释的简单代码:

var regex=/(ftp|https?):\/\//; alert('hello, world'); return regex;
Run Code Online (Sandbox Code Playgroud)

注意之前的双斜杠alert().使用正则表达式的愚蠢解析器会将有效的Javascript代码视为注释!

  • @Sam:通常我是regexp的主要提倡者,但是从javascript中删除注释过于复杂,绝对是最小化解析器的工作. (2认同)