【问题标题】:Javascript regex to match a pattern but NOT match a regex literal (r.js optimizer and uglify issue)?Javascript 正则表达式匹配模式但不匹配正则表达式文字(r.js 优化器和 uglify 问题)?
【发布时间】:2013-02-07 01:18:01
【问题描述】:

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

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

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

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 cmets 但忽略 HTML 注释正则表达式文字,解决问题吗?如果是这样,那个正则表达式会是什么样子?

【问题讨论】:

  • 如何将 JS 注入 HTML?也许您的模式充当 HTML 注释...
  • 注入我的 JS?抱歉,我没有关注。
  • 我没有使用骨干网和其他东西,但你必须以某种方式将你的 javascript 加载到 html。
  • 好吧,r.js 优化的最终结果是一个 JS 文件,而不是一个 HTML 文件,所以即使正则表达式文字充当 HTML 注释,我也不希望错误发生在帮助模块中正则表达式文字所在的确切位置。不过,我会再看一眼,记住这一点!

标签: javascript requirejs uglifyjs r.js


【解决方案1】:

将您的正则表达式更改为:

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

就 RE 处理器而言,单字符 [&lt;] 类等效于 &lt;,但现在 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');

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

【讨论】:

  • 或者像/\&lt;!--.*?--\&gt;/g一样逃避它
  • 我会试一试,我确实记得 uglify 抱怨未转义的字符。知道为什么 uglify 会抱怨未转义的字符但 JS 本身对正则表达式文字没有问题吗?
  • @kbec 只需要第二次转义。
  • 我不熟悉uglify,所以不知道。您确定它是在抱怨 RE,而不是代码中的其他内容吗?
  • 嗯,错误会波动,具体取决于 uglify 设置和使用的正则表达式。肯定会尝试您的建议并报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多