为了给未来的读者添加这个答案,有几种方法可以让这个答案更有活力。
本质上,您只是对分隔列表进行两次解析并取出您需要的部分。 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 字符串,# 和 = 这两个肯定会在没有编码和正确处理的情况下导致您出现问题。