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

如何用JavaScript创建自定义编程语言?现有脚本部分命令失效求助

自定义编程语言部分指令失效的问题修复

你的代码核心问题在于字符串替换逻辑存在缺陷,导致部分指令无法被正确转换执行:

问题分析

  1. 单次替换限制:String.replace() 默认只替换第一个匹配的内容,若代码里有多个相同指令(比如多次调用 popup),只有第一个会被转换,后续指令会保留原始语法,无法正常执行。
  2. 无正则转义处理:如果自定义语法中包含正则特殊字符(比如 .、*),直接使用 replace 会导致匹配失败,破坏转换逻辑。

修复后的代码

JavaScript 部分

var result;

convert("popup:['hi']; get:['#hello']:hide;");

function convert(text) {
  result = text;
  // 优先处理后缀指令,避免与前缀冒号冲突
  a(":hide", ".style.display = 'none'");
  a(":show", ".style.display = 'block'");
  a(":html:", ".innerHTML = ");
  // 处理指令前缀
  a("popup:", "alert");
  a("get:", "document.querySelector");
  // 最后转换括号
  a("[", "(");
  a("]", ")");
  
  eval(result);
}

function a(text, textb) {
  // 转义正则特殊字符,防止匹配出错
  const escapedPattern = text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  // 使用全局正则替换所有匹配项
  result = result.replace(new RegExp(escapedPattern, 'g'), textb);
}

HTML 部分(无需修改)

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Blank template</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <h1 id="hello">hello there</h1>
  <script src="index.js"></script>
</body>
</html>

修复说明

  • 全局替换:通过正则表达式的 g 标志,确保所有匹配的语法都被转换,不再局限于第一个匹配项。
  • 正则转义:对替换目标字符串中的特殊字符进行转义,避免正则语法冲突,适配更复杂的自定义语法。
  • 替换顺序优化:先处理后缀指令(如 :hide),再处理前缀(如 popup:),最后转换括号,避免不同指令间的匹配干扰。

内容的提问来源于stack exchange,提问作者denoryprogrammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:43:36