You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从自定义语法标记代码构建/解析可更新的结构化数据对象?

需求:从模板文本中提取条件与变量并转换为结构化对象

我需要从给定的模板文本中搜索条件字段、值以及对应的@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)时,会重复创建新对象,而不是更新已有的对象结构

具体需求要求

  1. 动态识别条件中的字段名(比如VERSION可以是任意自定义名称)
  2. @assign的变量值可以包含HTML代码,需完整保留
  3. if和elseif条件支持单等号=或双等号==作为判断运算符
  4. 处理多个包含@assign的条件块时:
    • 若字段已存在(如VERSION),则为该字段新增对应值的属性
    • 若字段不存在(如LANG),则新建该字段的结构
  5. <@else>块中的变量需要更新对应字段下的ELSE对象
  6. 若已有字段值(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:18:10