禁用模板内的方法评估

Disable method evaluation inside template

我正在使用 Go 进行模板评估,以下是我的用例。

我们的应用程序要求客户在文本中包含基于前缀的占位符。

例如:

my name is {$.PRE.FIRSTNAME} 

这将自动替换为他们的名字,这只是一个简单的文本,会有更复杂的文本由客户输入。它甚至可以是 HTML.

以下是代码片段

在这里,第一个 templateText 工作完美文件,第二个评论的文件不工作。它抛出一个异常,说明函数未定义。

package main

import (
    "bytes"
    "html/template"
    "log"
)

// OuterObject  object
type OuterObject struct {
    PRE *InnerObject
}

// InnerObject macro object
type InnerObject struct {
    FIRSTNAME, LASTNAME string
}

func main() {
    // This works perfectly.
    templateText := "my name is {$.PRE.FIRSTNAME}  "
    // templateText := "my name is {$.PRE.FIRSTNAME} ().push(function() { globalAml.display('sss') };"
    //
    // Above templateText fails with exception :
    // function "globalAml" not defined
    //
    o := &OuterObject{
        PRE: &InnerObject{
            FIRSTNAME: "fName",
            LASTNAME:  "lName",
        },
    }

    var doc bytes.Buffer
    t, err := template.New("test").Delims("{", "}").Parse(templateText)

    if err != nil {
        log.Fatal("Error parsing tag", err)
    }
    err1 := t.Execute(&doc, o)
    if err1 != nil {
        log.Println("Error Execute tag", err1)
    }
    log.Println("Final text ", doc.String())
}

谁能帮我忽略方法调用,只替换基于前缀的占位符。

您的第二次替换失败,因为 {} 是模板分隔符。您需要引用它们才能完成这项工作:

templateText := "my name is {$.PRE.FIRSTNAME} ().push(function() {`{`} globalAml.display('sss') {`}`};"

我暂时能够通过将代码片段更改为以下内容来处理这种情况:

t, err := template.New("test").Delims("{$", "}").Parse(templateText)

我知道如果客户输入包含上述分隔符的文本,这将失败。

非常感谢,伙计们。