Javascript自定义模板引擎

Javascript自定义模板引擎,javascript,node.js,Javascript,Node.js,我正在尝试用javascript创建一个自定义模板引擎,但在开始时遇到了问题,因为我无法使用正则表达式提取令牌。 以下是要求: 变量的定义如下:$(变量) 函数:$(名称arg1“这是arg2,但它包含空格。”) 函数参数可以包含其他变量$(name$(variable)arg2) 变量和函数都将呈现为异步。例如:从db获取$(变量)的值,然后替换它 这不是为了呈现html页面,而是为了简单地替换用户在后端输入的字符串 编辑 更多信息: 假设用户输入以下字符串: $(id$(小写约翰)) 在后端

我正在尝试用javascript创建一个自定义模板引擎,但在开始时遇到了问题,因为我无法使用正则表达式提取令牌。 以下是要求:

  • 变量的定义如下:
    $(变量)
  • 函数:
    $(名称arg1“这是arg2,但它包含空格。”)
  • 函数参数可以包含其他变量
    $(name$(variable)arg2)
  • 变量和函数都将呈现为异步。例如:从db获取
    $(变量)
    的值,然后替换它

    这不是为了呈现html页面,而是为了简单地替换用户在后端输入的字符串

    编辑

    更多信息:
    假设用户输入以下字符串:
    $(id$(小写约翰))

    在后端应用程序上,必须执行以下操作:

  • 将“John”转换为小写
  • 从db获取“john”的id
  • 这只是一个简单的例子来说明这应该如何工作

    是否有任何库可以帮助我实现这一点?如果没有,你知道如何实施吗

    编辑2: 我尝试使用,并将分隔符更改为$(),但是函数(节)标记不满足要求。在Mustache中,对于函数,我必须这样做:
    $(#name)$(variable)“这是arg2,但它包含空格。”$(/name)
    而且它不支持异步呈现。

    。此正则表达式将标识可以替换的模板。请注意,它仅选择嵌套模板中最内层的模板

    /\$\((?<FirstTerm>\S+?)(?<OtherTerms>(?:\s+(?:\w+|".*?"))+)?\)/g
    
    /\$\((?\S+)(?(?:\S+(?:\w++“*?”)+)/g
    
    所以,只要递归地使用正则表达式替换函数和模板逻辑,直到不再有匹配项为止。内部模板将被替换,剩下的字符串将替换模板

    如果没有,你知道如何实施吗

    您应该使用抽象语法树,并编写兼容的解析器。虽然正则表达式(如Pedro Lima所述)适合于简单的模板化,但如果您想要扩展解析器,则需要一些更健壮的东西

    作为抽象语法树解析器的示例,
    $(test1$(test2)test3)lorem ipsum$(test4)
    将转换为以下内容:

    (感谢Mile Shang的树生成器。)


    至于具体如何编写解析器,我认为您可以理解。只需迭代字符串并检查模板分隔符。阅读模板库(如Handlebar)的源代码可能会有所帮助。

    本文中的其他答案是正确的,但是,我想与大家分享我是如何实现这一点的:

  • 创建一个递归匹配函数。我曾经实现过这个

  • 创建一个渲染函数,并在该函数内部调用递归匹配函数,以查找变量/函数名并将其替换为适当的值

  • 继续递归调用render函数,直到替换了函数中的所有参数


  • 这个问题需要更多的关注。花点时间阅读该页面上的链接和其他链接。模板文字在这种情况下不起作用。我要替换的字符串是由用户输入的,用户将遵循关于如何定义变量或函数的指定要求。为什么不能使用Regex提取令牌?似乎
    /\$\(.++\)/
    可以很好地工作。@MattF。这个正则表达式还匹配变量之间的文本,除非我遗漏了什么:它不能正常工作。请尝试-它不会选择包含其他模板的模板。这是一个很好的尝试,但我意识到正则表达式是错误的方法。@MattF。不,我说过不会的。我会改进我的答案。1秒钟哦,我误解了。在这种情况下,我认为这是正确的方法。