替换文件中的标记而不写入新文件

时间:2017-03-06 14:24:05

标签: javascript regex node.js rendering

我在文件中有HTML标记。我打算选择该标记,根据数据集替换其中的占位符,并返回合并的字符串。我可以简单地使用服务器端模板(我以前做过)但现在买不起,因为一些客户端代码需要相同的前端内容标记,即代码超出<apex:page standardController="account"> <apex:pageBlock title="The PageBLock"> <apex:pageBlockSection columns="1"> <apex:outputField value="{!account.name}"/> <apex:outputField value="{!account.billingstate}"/> <apex:outputField value="{!account.AccountNumber}"/> <apex:pageBlockSectionItem> <apex:outputLabel value="Name and Account Number" /> <apex:outputText value="{!account.name} {!account.AccountNumber}"></apex:outputText> </apex:pageBlockSectionItem> <apex:pageBlockSectionItem> <apex:outputText value="{0,date,long}"> <apex:outputLabel value="Created Date" /> <apex:param value="{!account.CreatedDate}"/> </apex:outputText> </apex:pageBlockSectionItem> <apex:repeat value="{!$ObjectType.account.FieldSets.New_Set}" var="field" > <apex:outputField value="{!account[field]}"/> </apex:repeat> </apex:pageBlockSection> </apex:pageBlock> </apex:page> 。目前,服务器只要在运行到exec函数时就会挂起,并且抛出也不会抛出console.errors。

代码看起来像这样

public/

本质上,我需要在一天结束时 var availableFoodsString = "", regexCb = function (dataSet, flag, indexPage) { return function(match, $1, index) { if (indexPage == undefined && dataSet["username"] != undefined) { dataSet["username_search"] = dataSet["username"]; } if (dataSet[$1] != undefined) return dataSet[$1]; else if (flag == "EMPTY") return ""; else if (flag == "MATCH") return match; } }; foodsModel.find({availableToday: true}, function(err, docs) { if (err) throw err; docs.forEach(function (doc) { doc = doc.toObject(); doc.image = "/images/food/" + doc.name + ".jpg"; var template = /(<div class="food-menu">(\s*.*)*<\/div>)/gi.exec(fs.readFileSync("public/index.html").toString())[0] availableFoodsString += template.replace(/\{\{(\w+)\}\}/gi, regexCb(doc)) }); }); 作为另一个值呈现给另一个占位符,即render({available:availableFoodsString})。

public / index.html是一个普通的HTML,介于两者之间

         

{{name}}

    

{{price}}

     添加到购物车

因此,在DOM完全加载后,某些jQuery代码在某些时候也需要这个令人垂涎的标记,而模型中的availableFoodsString包含名称和价格填充变量。

doc函数是异步的,是的,但它在http.createServer函数内部由数据库打开连接回调调用,因此该变量肯定是在那时加载的。

我已经看到了一些其他解决方案,例如this和相关问题,但它们都涉及从npm中恳求一些外部模块,或者在替换和合并到所需变量之前从匹配的标记中写入新文件。我知道必须有一种方法可以实现这一点而不需要任何这些。

1 个答案:

答案 0 :(得分:0)

这个问题与我的正则表达式有关。第二个括号犯了一个叫catastrophic backtracking的东西。这意味着比赛贪婪的方式使解释者通过地狱,即收回超过需要而不是根据需要反向回馈。我在正则表达式上敲了几个点,现在一切都无缝地工作了。

旧代码保持不变,只是正则表达式改变了:

/(<div class="food-menu">(\s*.*)*<\/div>)/gi

到此:

/(<div class="food-menu">(\s+.*)+<\/div>)/g

出于某种原因,以前的正则表达式似乎无缝地匹配文件字符串,我第一次测试它,但是一旦我用实际代码插入它就是残酷无情。