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

Javascript regex to match a pattern but NOT match a regex literal (r.js optimizer and uglify issue)?

本文关键字:正则表达式 优化 js uglify 问题 文本 模式 Javascript 不匹配      更新时间:2023-09-26

我有一个Backbone应用程序,使用Require.js将其组织成多个模块。其中一个模块包含一个Handlebars助手,我使用该方法为每个视图从所有HTML模板中提取一个合法的标头。标题包含在HTML注释中,因此我使用以下regex将其删除:

/<!--['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优化的构建时,帮助程序中的regex文本被剥离,导致我的整个r.js构建被炸飞。

我试图通过选择性地将onBuildWrite()中的regex应用于除helper:之外的所有模块来解决这个问题

onBuildWrite: function (moduleName, path, contents) {
    var htmlCommentRegex = /<!--['s'S]*?-->/g;
    if (moduleName !== "helpers/handlebars.compileClean") {
        contents = contents.replace(htmlCommentRegex, "");
    }
    return contents;
},

但当r.js配置中启用了uglification时,这似乎不起作用regex似乎仍然在整个构建的脚本上运行,包括helper,导致构建爆炸。

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

有人知道为什么uglify会打破这个吗?切换到一个不同的正则表达式,可以捕获HTML注释,但忽略HTML注释正则表达式的文字,会解决问题吗?如果是,正则表达式会是什么样子

将正则表达式更改为:

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');

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