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注释中,因此我使用以下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');
希望它没有做足够的代码分析来消除这种混淆。
相关文章:
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- 正则表达式在字符串中找到base64
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- 使用正则表达式评估电子邮件地址时出现性能问题
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 正则表达式只允许 x 个整数
- 使用正则表达式将输入格式设置为单字符逗号、单字符逗号等
- 改进用于验证付款金额的正则表达式
- 正则表达式与数字中的第二个点匹配
- 键按正则表达式以查找具有负值的小数
- 一个正则表达式,用于从JS中的HTML标记中删除id、样式和类属性
- Javascript 正则表达式:查找所有 URL 优化
- 为Javascript优化Gruber URL正则表达式
- 优化正则表达式匹配域名在url
- 优化用户名验证正则表达式的前瞻性
- Javascript正则表达式匹配模式,但不匹配正则表达式文本(r.js优化器和uglify问题)