Javascript正则表达式匹配模式但不匹配正则表达式文字(r.js优化器和uglify问题)?

时间:2013-02-07 01:18:01

标签: javascript requirejs uglifyjs r.js

我有一个Backbone应用程序,使用Require.js组织成模块。其中一个模块包含一个Handlebars帮助器,它有一个方法,用于从每个View的所有HTML模板中提取合法标头。标题包含在HTML注释中,因此我使用以下正则表达式将其删除:

/<!--[\s\S]*?-->/g

现在,当我使用r.js优化(连接/编译/缩小)应用程序时,我正在使用r.js的onBuildWrite()方法执行相同的HTML注释删除:

onBuildWrite: function (moduleName, path, contents) {
    var htmlCommentRegex = /<!--[\s\S]*?-->/g;

    return contents.replace(htmlCommentRegex, "");
},

现在,不幸的是,这意味着当包含Handlebars帮助程序的Require.js模块被拉入r.js优化版本时,帮助程序中的正则表达式文字将被删除,从而导致我的整个r.js建立轰炸。

我试图通过有选择地将onBuildWrite()中的正则表达式应用于所有模块来解决问题,除了帮助程序:

onBuildWrite: function (moduleName, path, contents) {
    var htmlCommentRegex = /<!--[\s\S]*?-->/g;

    if (moduleName !== "helpers/handlebars.compileClean") {
        contents = contents.replace(htmlCommentRegex, "");
    }

    return contents;
},

但是在r.js配置中启用uglification时,这似乎不起作用; 正则表达式STILL似乎在整个构建的脚本上运行,包括帮助程序,导致构建爆炸。

如果在r.js配置中禁用了uglify,一切正常。

任何人都有任何想法为什么uglify会打破这个?将切换到不同的正则表达式,这将捕获HTML注释,但IGNORE HTML注释正则表达式文字,解决问题?如果是这样,那正则表达式是什么样的?

1 个答案:

答案 0 :(得分:1)

将正则表达式更改为:

var htmlCommentRegex = /[<]!--[\s\S]*?-->/g;

就RE处理器而言,单字符[<]类相当于<,但现在RE不再匹配自身。

另一种方法是转义RE中的一个文字字符:

var htmlCommentRegex = /<\!--[\s\S]*?-->/g;

或者您可以从字符串构建RE:

var htmlCommentRegex = new RegExp('<!'+'--[\s\S]*?-->', 'g');

如果r.js将所有这些优化回原始文本,请尝试:

var commentPrefix = '<!';
var htmlCommentRegex = new Regexp(commentPrefix+'--[\s\S]*?-->', 'g');

希望它没有做足够的代码分析来撤消这种混淆。