簡體   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