为什么当我直接输出从 <cffunction> 返回的值时,Lucee 会在前导 space 字符前面加上如何停止它?

Why does Lucee prepend a leading space character when I directly output values returned from a <cffunction> and how do I stop it?

我在函数输出方面遇到了一个非常奇怪的问题。我有一个清理用户输入的基本功能。当我尝试输出函数结果时,我得到了带有 space 前缀的值。如果我将函数结果分配给一个变量然后输出该变量,则 space 不存在。这是我正在谈论的一个例子。假设有一个名为 fn_SanitizeInput().

的函数
<cfset var_UserInput = "foo">
<cfset var_SanitizedUserInput = fn_SanitizeInput(var_UserInput)>  // foo

<cfoutput>

    Input Length: #len(var_UserInput)#          // 3
    Sanitized Input Length:
        #len(fn_SanitizeInput(var_UserInput))#  // 3
        #len(var_SanitizedUserInput)#           // 3

    Function Output: |#fn_SanitizeInput(var_UserInput)#|                // | foo|
    Trimmed Function Output: |#trim(fn_SanitizeInput(var_UserInput))#|  // | foo|
    Var Output: |#var_SanitizedUserInput#|                              // |foo|

</cfoutput>

我不明白为什么len()函数returns3,打印结果的时候却显示四个字符。由于修剪函数仍然给我领先的 space,我觉得函数结果是正确的,并且 Lucee 在执行评估时出于某种未知原因添加了 space。还有其他人 运行 参与其中吗?如果需要,我可以先将所有结果分配给一个变量,但我仍然想知道为什么会这样。

简答

改变

<cffunction name="fn_SanitizeInput">
    <cfargument name="arg">
    <cfreturn arguments.arg>
</cffunction>

<cffunction name="fn_SanitizeInput" output="false">
    <cfargument name="arg">
    <cfreturn arguments.arg>
</cffunction>

更长的答案

space 是从哪里来的?

space是从<argument>标签结束到<cfreturn>标签开始。如果你真的想,你可以

<cffunction name="fn_SanitizeInput"><cfargument name="arg"><cfreturn arguments.arg></cffunction>

您编写的代码可能如下所示:

#len(fn_SanitizeInput(var_UserInput))#

但实际上是这样的:

 <cfsavecontent var="result">#fn_SanitizeInput(var_UserInput)#</cfsavecontent>

 #len(result)#

有些社论

我真希望函数的 cfml 默认输出模式是无声的,可惜它不是。为了我自己的理智,我设置了 output="false" 这样我就不用担心了。