Coldfusion 为什么这个函数不返回一个将在ListToArray或ValueList中工作的字符串?

Coldfusion 为什么这个函数不返回一个将在ListToArray或ValueList中工作的字符串?,coldfusion,coldfusion-10,coldfusion-11,Coldfusion,Coldfusion 10,Coldfusion 11,我在format.cfc组件中创建了一个函数,该函数返回一个字符串,其中不包含任何HTML代码: <cffunction name="RemoveHTML" access="public" returntype="string" output="false" hint="Returns a string without any html"> <cfargument name="UserString" required="yes"> <cfset var re

我在
format.cfc
组件中创建了一个函数,该函数返回一个字符串,其中不包含任何HTML代码:

<cffunction name="RemoveHTML" access="public" returntype="string" output="false" hint="Returns a string without any html">
  <cfargument name="UserString" required="yes">
  <cfset var result = "#REReplaceNoCase(Canonicalize(ARGUMENTS.UserString,false,true),'<[^>]*(?:>|$)', '', 'ALL')#">
  <cfreturn result>
</cffunction>

现在,我想在每个空格处拆分字符串,并将其转换为一个列表。所以我尝试使用ValueList()和ListToArray(),但他们不喜欢从函数返回的值

使用ValueList()时,我会收到一个错误消息:

函数ValueList不支持复杂构造

或者在使用ListToArray时出现以下错误:

无法将复杂对象类型转换为简单值

我基本上就是这么做的:

<!--- ValueList() --->
<title>#ValueList(Application.Format.RemoveHTML(UserString = rsProduct.Title), ' ')#</title>

<!--- ListToArray() --->
<title>#ListToArray(Application.Format.RemoveHTML(UserString = rsProduct.Title), ' ')#</title>

#ValueList(Application.Format.RemoveHTML(UserString=rsProduct.Title),“”)#
#ListToArray(Application.Format.RemoveHTML(UserString=rsProduct.Title),“”)#
如果我删除ListToArray()或ValueList()函数,那么我会得到我期望的结果——一个没有HTML的产品标题字符串


那么,为什么函数即使看起来像字符串也不返回字符串呢?还是我遗漏了一些非常明显的东西?

正如其他人在评论中指出的那样,
ValueList
用于返回包含在查询对象列中的值列表。它不能使用字符串值

ListToArray
将列表转换为数组。然后不能在HTML中输出数组。因此,
ListToArray
工作正常,只有当您尝试在
cfoutput
中显示它时才会发生错误

最好使用CF中的内置编码函数,例如
encodeForHTML
。因此,您可以执行以下操作:

<title>#encodeForHTML(Application.Format.RemoveHTML(UserString = rsProduct.Title))#</title>
<title>#encodeForHTML(replace(RemoveHTML(rsProduct.Title), " ", ",", "all"))#</title>
当然,您可以将
replace
放在自定义函数中,我只是演示它是如何工作的

您需要知道,它将用逗号替换所有空格,因此如果一行中有2个或更多空格,则它将显示
(取决于空格的数量)。要解决这个问题,可以使用如下正则表达式:

<title>#encodeForHTML(reReplace(RemoveHTML(rsProduct.Title), " +", ",", "all"))#</title>

就我个人而言,我会选择正则表达式版本,因为它功能更强大,但您会希望将其封装在一个函数中,以保持视图的整洁。

正如其他人在注释中指出的那样,
ValueList
旨在返回包含在查询对象列中的值列表。它不能使用字符串值

ListToArray
将列表转换为数组。然后不能在HTML中输出数组。因此,
ListToArray
工作正常,只有当您尝试在
cfoutput
中显示它时才会发生错误

最好使用CF中的内置编码函数,例如
encodeForHTML
。因此,您可以执行以下操作:

<title>#encodeForHTML(Application.Format.RemoveHTML(UserString = rsProduct.Title))#</title>
<title>#encodeForHTML(replace(RemoveHTML(rsProduct.Title), " ", ",", "all"))#</title>
当然,您可以将
replace
放在自定义函数中,我只是演示它是如何工作的

您需要知道,它将用逗号替换所有空格,因此如果一行中有2个或更多空格,则它将显示
(取决于空格的数量)。要解决这个问题,可以使用如下正则表达式:

<title>#encodeForHTML(reReplace(RemoveHTML(rsProduct.Title), " +", ",", "all"))#</title>

P>个人认为我会使用正则表达式版本,因为它更强大,你会想把它打包在一个函数中,但是要保持视图的整洁。

< P>我认为有多种方法来做这件事,请考虑下面是我的文本

<cfset myText = "Samsung Galaxy Note 4"/>

第一种方法是使用简单的替换函数

<cfset firstSolution = replace(myText," ",",","all")/>
<cfdump var="#firstSolution#" />

第二种方法是使用重置换法

<cfset secondSolution = rEReplace(myText,"\s+",",","all")/>
<cfdump var="#secondSolution#" />


<如果我是你,我会使用第二个方法,因为如果我在字符串中有多个空格,而不是得到多个,‘我会得到一个’,“在字符串的标题中使用字符串,我不会冒任何错误,不正确的标题。

< P>我认为有多种方法来做这件事,请考虑下面是我的文本

<cfset myText = "Samsung Galaxy Note 4"/>

第一种方法是使用简单的替换函数

<cfset firstSolution = replace(myText," ",",","all")/>
<cfdump var="#firstSolution#" />

第二种方法是使用重置换法

<cfset secondSolution = rEReplace(myText,"\s+",",","all")/>
<cfdump var="#secondSolution#" />


如果我是你,我会使用第二种方法,因为如果我的字符串中有多个空格,那么在页面标题中使用“,”I will get single“,”给定字符串,而不是“多个”,如果标题不正确,我不会承担任何风险。

您可以发布removeHtml函数的输出以及您期望的最终输出吗?ValueList()设计用于处理查询对象,因此在简单字符串上使用它是不合适的。对于ListToArray(),请在您自己键入的简单字符串上尝试它,例如“try this”。查看它是否转换为数组。原因valueList与查询一起工作,listToArray用于将列表转换为数组。如果您只想将空间替换为“”,则必须使用replace()来执行此操作that@DanBracuk我不认为这些空格是从字符串返回的普通空格。如果我对字符串执行EncodeForHTMLAttribute(),我会得到类似于
Samsung ;银河 ;注 ;4
您可以发布removeHtml函数的输出以及您期望的最终输出吗?ValueList()设计用于处理查询对象,因此在简单字符串上使用它是不合适的。对于ListToArray(),请在您自己键入的简单字符串上尝试它,例如“try this”。查看它是否转换为数组。原因valueList与查询一起工作,listToArray用于将列表转换为数组。如果您只想将空间替换为“”,则必须使用replace()来执行此操作that@DanBracuk我不认为这些空格是从字符串返回的普通空格。如果我对字符串执行EncodeForHTMLAttribute(),我会得到类似于
Samsung ;银河 ;注 ;4
我可以这样做,但我需要用逗号替换空格来生成一个列表,好吧,那么就用它吧。替换以替换空格。将更新答案。这就是问题所在,它不起作用。我已经手动输入并测试了这个#ListToArray('Samsung Galaxy Note 4','')#它拒绝将其作为复杂对象类型。但它只是一根绳子