[英]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.