如何从自定义语法标记代码构建/解析可更新的结构化数据对象?
需求:从模板文本中提取条件与变量并转换为结构化对象
我需要从给定的模板文本中搜索条件字段、值以及对应的@assign变量,将其转换为符合要求的结构化对象,仅当条件块中包含@assign时才需要构建对象。
示例模板文本
// condition 1 <@if VERSION = "A1" || VERSION = "A3"> <@assign CTA = "blue"> <@assign CTA2 = "green"> <@assign TEXT1 = "Hello<br/>World"> <@elseif VERSION = "A2"> <@assign CTA = "red"> <@assign CTA2 = "yellow"> <@assign CTA3 = "brown"> <@assign TEXT1 = "Click <a href='https://example.com' style='text-decoration:none;color:#000000;'>here</a>"> <@else> <@assign CTA = "black"> <@assign CTA2 = "white"> <@assign CTA3 = "pink"> </@if> // condition 2 <@if VERSION = "A4" || VERSION = "A5"> <@assign CTA = "purple"> <@assign CTA2 = "orange"> <@assign TEXT1 = "Hi <span style='font-weight:bold;'>John</span>"> </@if> // condition 3 <@if LANG = "en_US"> <@assign TITLE = "English"> <@else> <@assign TITLE = "French"> </@if>
我尝试的代码
JavaScript 部分
jsonObj = []; var hidden_text = html_c.replace(/<@IF[\s\S]*?<\/@IF>/gi, function(i) { i = i.replace(/<@IF[\s\S]*?>/gi, function(k) { var $ogg; item = {} k = k.replace(/(^(?!.*@IF)|(?<=@IF)).*?((?=\=))/gi, function(x) { x = x.replace(/^\s+|\s+$|\s+(?=\s)/g, ""); item[x] = []; $ogg = x; return x; }); jsonObj.push(item); item2 = {} k = k.replace(/"[\s\S]*?"/gi, function(y) { item2[y] = []; return y; }); item[$ogg].push(item2); return k; }); return i; }); console.log(jsonObj);
HTML 部分
<script> const html_c = ` <@if VERSION = "A1" || VERSION = "A3"> <@assign CTA = "blue"> <@assign CTA2 = "green"> <@assign TEXT1 = "Hello<br/>World"> <@elseif VERSION = "A2"> <@assign CTA = "red"> <@assign CTA2 = "yellow"> <@assign CTA3 = "brown"> <@assign TEXT1 = "Click <a href='https://example.com' style='text-decoration:none;color:#000000;'>here</a>"> </@if> // condition 2 <@if VERSION = "A4" || VERSION = "A5"> <@assign CTA = "purple"> <@assign CTA2 = "orange"> <@assign TEXT1 = "Hi <span style='font- weight:bold;'>John</span>"> </@if> // condition 3 <@if LANG = "en_US"> <@assign TITLE = "English"> <@else> <@assign TITLE = "French"> </@if> `; </script>
当前代码的问题
- 只能生成对象的初始框架,无法完整提取
@assign的变量和值 - 遇到同名字段(比如VERSION)时,会重复创建新对象,而不是更新已有的对象结构
具体需求要求
- 动态识别条件中的字段名(比如VERSION可以是任意自定义名称)
@assign的变量值可以包含HTML代码,需完整保留if和elseif条件支持单等号=或双等号==作为判断运算符- 处理多个包含
@assign的条件块时:- 若字段已存在(如VERSION),则为该字段新增对应值的属性
- 若字段不存在(如LANG),则新建该字段的结构
<@else>块中的变量需要更新对应字段下的ELSE对象- 若已有字段值(如VERSION="A1"),新增对应
@assign时需覆盖已有属性值,并新增之前不存在的属性(比如新增TEXT2)
期望生成的最终对象结构
[ { "VERSION": [ { "A1": [ { "CTA": "blue", "CTA2": "green", "TEXT1": "Hello<br/>World" } ], "A3": [ { "CTA": "blue", "CTA2": "green", "TEXT1": "Hello<br/>World" } ], "A2": [ { "CTA": "red", "CTA2": "yellow", "CTA3": "brown", "TEXT1": "Click <a href='https://example.com' style='text-decoration:none;color:#000000;'>here</a>" } ], "A4": [ { "CTA": "purple", "CTA2": "orange", "TEXT1": "Hi <span style='font-weight:bold;'>John</span>" } ], "A5": [ { "CTA": "purple", "CTA2": "orange", "TEXT1": "Hi <span style='font-weight:bold;'>John</span>" } ], "ELSE": [ { "CTA": "black", "CTA2": "white", "CTA3": "pink" } ] } ], "LANG": [ { "en_US": [ { "TITLE": "English" } ], "ELSE": [ { "TITLE": "French" } ] } ] } ]
补充示例(对应需求第6条)
如果新增以下模板代码:
<@if VERSION = "A1"> <@assign CTA = "black"> <@assign TEXT2 = "Hello world"> </@if>
需要更新VERSION下的A1对象:将CTA的值覆盖为"black",同时新增TEXT2属性,最终A1的结构变为:
"A1": [ { "CTA": "black", "CTA2": "green", "TEXT1": "Hello<br/>World", "TEXT2": "Hello world" } ]
内容的提问来源于stack exchange,提问作者Vale46
相关产品推荐
相关产品推荐

