如何在 CFML 中填充模板字符串

How to populate a template string in CFML

请原谅这里的新手问题,但我试图在从查询中提取的字符串中允许自定义变量,并将其替换为另一个查询的结果。所以为了简化它,我需要这样的东西......

<cfset mystring = "This is my %firstname% and this is my %lastname%.">

然后假设我有 MyQuery,first 和 MyQuery.last 的查询结果,我想用最有效的方法将 mystring 中的 %firstname% 和 %lastname% 替换为查询结果。

任何 help/example 将不胜感激!

谢谢。

如果您有这样的查询:

<cfquery name="myquery" datasource="mydatasource">
  select firstname, lastname from users
</cfquery>

然后您将通过执行以下操作输出其中的值:

<cfoutput query="myquery">
   <cfset variables.mystring = "This is my #firstname# and this is my #lastname#.">
</cfoutput>

您在寻找 replaceNoCase() 吗?

<cfset myNewString = replaceNoCase(myString, '%firstname%', myQuery.first, 'all')>
<cfset myNewString = replaceNoCase(myNewString, '%lastname%', myQuery.last, 'all')>

如果您使用的是 Lucee,那么您可以利用 replace(string, struct)(显示 cfscript 语法):

template = "This is my %firstname% and this is my %lastname%.";

replaceMap = {
    "%firstname%" : "John"
   ,"%lastname%"  : "Doe"
}

populated = replace(template, replaceMap);    // use replaceNoCase() for case-insensitivity

所有替换都发生在 Java 代码中,这比在 CFML 循环中执行更有效。

此外,replace()replaceNoCase() 更有效,因此如果事先知道 CaSe,您应该尽可能使用 replace(),或者考虑将大小写标准化,例如在调用 replace().

之前使用 lcase()