Coldfusion:如何将字符串拆分为一组变量

18

我正在尝试自学 ColdFusion。

我从数据库中得到了一个以此格式为准的字符串:

domain.com
<br/>
www.facebook.com/facebookpage
<br/>
http://instagram.com/instagrampage

这些内容全部来自于 #getRacer.txtDescription#。这段文字的格式始终保持不变。

我需要将其分成3个变量。我尝试了以下代码(源自Adobe网站的示例)

<h3>ListToArray Example</h3>
<cfset myList = ValueList(getRacer.txtDescription)>
<p>My list is a list with <cfoutput>#ListLen(myList)#</cfoutput> elements.
<cfset myArrayList = ListToArray(myList,'<br/>')>
<p>My array list is an array with 
<cfoutput>#ArrayLen(myArrayList)#</cfoutput> elements.

我不知怎么地在数组里面有11个项目。

谢谢


你的列表中有多少个元素? - Dan Bracuk
3
你也可以使用 replace(myList,'<br>',',','all') 将其转换为真正的列表,这样你就不必依赖基础 Java 方法。 - Matt Busche
1
“真实列表”- 这是一个无意义的短语;不存在所谓的“真实”列表。逗号只是List~字符串操作函数的默认分隔符。 - Peter Boughton
2个回答

28

这应该可以工作。

<cfset TestSTring = "domain.com<br/>www.facebook.com/facebookpage<br/>http://instagram.com/instagrampage">

<cfset a = TestString.Split("<br/>")>
ListtoArray之所以显示11个项,是因为ColdFusion将定界符字符串(<br/>)中的每个字符都视为单独的定界符。根据@Leigh的评论更新我的答案,确保人们应该学习Coldfusion API而不是摆弄Java函数,<cfset a = ListToArray(TestString, "<br/>", false, true)>也可以工作。感谢Leigh。注意:结尾处的false是为了includeEmptyFields标志,true是为了multiCharacterDelimiter标志。请参阅文档

4
这种情况下不需要使用Java函数。CF9+支持多字符分隔符:listToArray(..., multiCharacterDelimiter) - Leigh
1
@JamesAMohler - 实际上它是一个Java对象:String[]。虽然它类似于CF数组,并且可以与大多数CF数组函数一起使用,但也存在一些细微的差异。与CF数组不同,它是不可变的,因此您无法添加或删除元素。 - Leigh
3
如果你正在学习CF,可能现在可以先跳过Java部分,集中学习核心函数。我通常建议人们在使用底层的Java函数之前仔细阅读API。split() 方法接受一个正则表达式(不仅仅是普通字符串),因此某些字符需要转义。此外,与大多数CF函数不同,它是大小写敏感的。这些差异会让一些人措手不及,导致他们对出乎意料的结果感到困惑。 - Leigh
2
我不确定是否应该建议他完全跳过Java函数,特别是String函数。Java String函数是使Java在CF中如此强大的重要组成部分。此外,它们通常比CF函数快得多。将一点Java混合到其中会使CF学习起来更加复杂,但我认为这将使他成为一个更全面的CF开发人员。 - Shawn
我显然同意Shawn的观点,除了“它们通常比CF函数快得多” - 这并不总是正确的 - 它们可以更快,但也可能更慢(在这两种情况下,差异是否显著因情况而异)。 - Peter Boughton
显示剩余8条评论

2
<cfset myList = ReplaceNoCase(getRacer.txtDescription,'<br/>','|','ALL')>
<cfset myArrayList = ListToArray(myList,'|')>

我选择了管道字符,因为它不太可能已经存在于您的字符串中。如果您想考虑您的BR标签可能或可能不使用XML语法的可能性,那么您可以使用正则表达式:

<cfset myList = ReReplaceNoCase(str,'<br/?>','|','ALL')>
<cfset myArrayList = ListToArray(myList,'|')>

不要因为“不太可能”而投反对票 - 你不知道描述中可能包含什么!此外,还有专门用于分隔的ASCII字符,如果需要进行分隔符交换(实际上并不需要),可以使用它们。 - Peter Boughton
2
抱歉如果我表达不清楚。我指出这个字符是可以更改的。我试图提供一个简单的例子。Leigh提到了他偏好不使用Java的答案,我试图提供这样的答案。 - Steve Bryant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接