想输出
我叫 Bob,我今年 20 岁了,我喜欢吃苹果。
如何通过 JSON 和模板来输出这句话, 假如(我说的假如)模板如下:
template{我叫%s,我今年%s 岁了,我喜欢吃%s。}, key{{}.person.name, {}.person.age, {}.fruit[0].name}
{
    "fruit": [
        {
            "name": "apple",
            "sweet": 1
        },
        {
            "name": "banana",
            "sweet": 0
        }
    ],
    "person": {
        "name": "Bob",
        "age": 20
    }
}
     1 
                    
                    lihongjie0209      2018-03-24 11:14:57 +08:00 
                    
                    这种功能后端模版很简单, 比如 jsp, 前端就不知道了 
                 | 
            
     2 
                    
                    daimazha      2018-03-24 11:24:04 +08:00 
                    
                    
                 | 
            
     3 
                    
                    TomorJM   OP 问题简化为: 
                 | 
            
     4 
                    
                    TomorJM   OP 输入一段模板和 json, 输出处理后的结果 
                 | 
            
     5 
                    
                    deepred      2018-03-24 13:09:35 +08:00 
                    
                    最简单的模板引擎原理就是利用正则把占位符用 json 数据替换 
                 | 
            
     6 
                    
                    qiayue   PRO 正则找出所有的%s,按顺序替换 
                 | 
            
     7 
                    
                    xiangyuecn      2018-03-25 11:58:01 +08:00 
                    
                    核心还不是简单的解析替换 
                写一个 js 简单的实现: ``` template="我叫{person.name},我今年{person.age}岁了,我喜欢吃{fruit[0].name}"; json={"fruit":[{"name":"apple","sweet":1},{"name":"banana","sweet":0}],"person":{"name":"Bob","age":20}}; template.replace(/{(.+?)}/g,function(a,b){ var res=""; try{ var res=eval('json.'+b)||"";//核心逻辑,语法解析,js 实现起来比较简单粗暴,前提模板是安全的 }catch(e){console.error(e)} //稍微处理一下,数据是不安全的 res=(res==null?"":res+"").replace(/[<"'\{&]/g,function(a){return "&#"+a.charCodeAt(0)+";"}); return res; }) ```  |