当我直接输出从<cffunction>返回的值时,Lucee为什么要在前导空格字符前加前缀,以及如何停止它?

时间:2019-11-12 22:19:29

标签: function coldfusion cfml removing-whitespace lucee

我对函数的输出有一个非常奇怪的问题。我有一个用于清理用户输入的基本功能。当我尝试输出函数结果时,我得到的值前面带有空格。如果我将函数结果分配给变量,然后输出该变量,则不存在空格。这是我正在谈论的示例。想象有一个名为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()函数返回3,但是在打印结果时会显示四个字符。而且由于修剪函数仍然给我领先的空间,我觉得函数结果是正确的,并且Lucee在执行评估时出于某种未知原因而添加了空间。还有其他人遇到吗?如果需要,我可以先将所有结果分配给变量,但是我仍然想知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:4)

简短答案

更改

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

收件人

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

更长的答案

空间从何而来?

空格从<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",所以我不必为此担心。