我有一个这样的字符串,我是从数据库中获得的:
user=me@example.com&name=John
我想知道是否有一种简单的方法可以提取数据并将其放入两个变量(用户和名称)。
答案 0 :(得分:6)
@Marc,根据@Dan Bracuk的建议,您可以通过首先使用提及的分隔符作为&
,然后再次使用=
来分割字符串。请参考下面的代码,对您有帮助。我希望。
<cfset yourInput= 'user=me@example.com&name=John'>
<!--- Get the first value. I mean "user" part --->
<cfset splitFirstPart = listfirst(yourInput,'&', true)>
<cfset splitLastPart = listlast(yourInput, '&', true)>
<!--- Get the second part value --->
<!--- Above values are split by using & --->
<cfset user = listlast(splitFirstPart, '=', true)>
<Cfset name = listlast(splitLastPart, '=', true)>
<!---
Now we can again split the list by using =.
Now you can see the result.
--->
<cfoutput>
User : #user# <br/>
Name : #name#
</cfoutput>
如果您需要任何其他CFML功能和说明,请参阅https://cfdocs.org/
谢谢。
答案 1 :(得分:3)
这是我要解决的问题。
我喜欢将结构作为最终结果。我也喜欢将每个函数作为隐式循环使用。
<cfscript>
yourInput= 'user=me@example.com&name=John';
variables.result = {};
ListEach(yourInput,
function(item) { variables.result[listfirst(item, "=")] = listLast(item, "="); },
"&");
writedump(result);
</cfscript>
答案 2 :(得分:2)
要为将来的读者增加此答案,有两种方法可以使此过程更具动态性。
本质上,您只是两次解析定界列表并取出所需的片段。 ColdFusion允许使用几种方法来执行此操作。
为说明起见,我已添加到原始字符串。
string="user=me@example.com&name=John&somethingelse=42&foo&base64Msg=QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg==" ;
我首选的解析方式是给我们一个CF函数,该函数返回我需要的所有片段的结构。
public Struct function parseURLParamString( required String inURLStr ) {
/// Initialize the return struct.
var retStruct = {} ;
// Use listEach() function to iterate over the list with delim "&"
arguments.inURLStr.listeach(
function(item){
// listFirst gets 1st list element. listRest() gets all but 1st element. Delim "="
retStruct[listFirst(item,"=")] = listRest(item,"=") ;
}
, "&"
) ;
return retStruct ;
}
writeDump( parseURLParamString(string) ) ;
这将返回:
然后,您可以仅从返回的结构中引用所需的变量。
但是,如果您需要创建实际变量而不是从结构中提取它们,可以这样做:
arguments.inURLStr.listeach(
function(item){
variables[listFirst(item,'=')] = listRest(item,"=") ;
}
, "&"
) ;
...,然后将外部函数更改为返回Void
或不返回任何内容,并从中删除该结构。您可以引用变量user = #user#
。这将需要您事先了解变量,而在传递特定结构时,您可以循环遍历该结构并输出键/值。从技术上讲,您也可以在variables
范围内循环,但是那里可能还会有很多其他变量。
如果需要,也可以使用getToken()
,但是它具有与listLast()
相同的限制。如果您的value
包含第二个定界符文本(如填充的Base64字符串),则这些字符将被视为定界符,并保留您的值。对于base64Msg = QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg==
,getToken()
/ listLast()
将返回QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg
,其中listRest()
将给您QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg==
。甚至更糟的是,如果字符在字符串的中间,它将被截断。 ListLast()
删除定界列表的第一项并返回列表的其余部分,因此,如果您的字符串包含定界符,它将返回完整值。
最后,由于这似乎是URL中的字符串,因此您可能需要先对字符串进行清理和编码,然后再将其存储在数据库中。
如果保存编码值,则很有可能会将定界符变成其编码值。上面的部分仅支持单字符定界符,因此无法如上使用(除非在发送到拆分功能之前进行解码)。 listToArray
允许使用多字符定界符。因此,这可能是拆分它们的一种方法。
最后,有很多允许使用URL字符串的字符,#
和=
这两个字符肯定会导致您在没有编码和正确处理的情况下出现问题。
答案 3 :(得分:1)
您可以使用“ ListToArray”,并使用“&”作为分隔符来分割每个值,然后再次使用(如果只有2个值,则使用ListFirst和ListLast),但是这次使用“ =”作为分隔符,那样将以[“ user=me@example.com”,“ name = John”]作为第一结果,并以[[[user],[me@example.com]],[[name],[John]]]作为第一结果第二。
我通常建议使用结构而不是简单的变量,这里举一个例子
<cfscript>
/* My Raw string */
MyString = "user=me@example.com&name=John";
/* Breaking my single string in multiple values */
MyArrayOfValues = ListToArray(MyString, "&");
/* Creating my struct o hold my values */
MyStruct = StructNew();
/* Interating over my values */
for (Value in MyArrayOfValues){
// First Interaction will be: user=me@example.com and the second will be name=John and etc...
/* Get My attribute name */
MyAttributeName = ListFirst(Value, "=");
/* Get My attribute value */
MyAttributeValue = ListLast(Value, "=");
/* Evaluate the values of you borth variables and asign each other */
Evaluate("MyStruct.#LCase(MyAttributeName)# = '#MyAttributeValue#'");
}
/* Here you can see your value printed as struct formed by 2 atributes, name and user, both in lower case */
writeDump(MyStruct);
/* Here one example how to use this data */
writeOutput("
Hi my name is #MyStruct.name# and my user is #MyStruct.user#!
");
</cfscript>
这种方法是一种更通用的方法,因为您可能会在数据库中拥有更多的列,甚至可以将其与另一个数据库中的其他数据一起使用,始终遵循相同的结构...用&分隔的值和将属性和value分隔的值=