繁体   English   中英

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

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

我有一个Backbone应用程序,使用Require.js分为模块。 这些模块之一包含一个Handlebars帮助器,该帮助器具有一种方法,可用于从每个视图的所有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优化的构建中时, 该帮助器中的regex文字被剥离了 ,导致我的整个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配置中启用丑化时,这似乎不起作用。 regex STILL似乎正在整个构建脚本 (包括帮助程序)上运行,从而导致构建被炸毁。

如果在r.js配置中禁用了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');

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM