我发布了对斯科特答案的评论,但它太长了,所以......
约翰写道:
运行以下示例,我最终得到的值为 0,
但我认为它应该是整个键值?
<cfoutput>
<cfset theUrl = "https://docs.google.com/spreadsheet/ccc?key=0AthiZNZ73LBndUzRTUkplbmNhYWc##gid=0" />
<cfset theUrl = listRest(theUrl, "?")>
<cfloop list="#theUrl#" index="URLPiece" delimiters="&">
Key: #listFirst(urlPiece, "=")# Value: #listLast(urlPiece, "=")# <br />
</cfloop>
</cfoutput>
该示例 URL 失败的原因是它包含一个页面段(哈希后的位),需要在解析查询字符串之前将其剥离。
通过将键/值部分包装在UrlDecode 中来获取正确的变量/值也很重要。
另外,值中有一个等号是完全可以接受的,所以?key== 应该返回= 作为值,这意味着将ListLast 更改为ListRest 并将includeEmptyFields 设置为true .
另外,如果您有一个查询字符串,例如 ?a&b,那么约定是将值设置为 true 或空字符串 - 当前代码设置为键名,这是错误的。
总而言之,这是一个函数:
<cffunction name="getParamsFromUrlString" returntype="Struct" output=false >
<cfargument name="UrlString" type="String" required />
<cfargument name="Separator" type="String" default="?" />
<cfargument name="Delimiter" type="String" default="&" />
<cfargument name="AssignOp" type="String" default="=" />
<cfargument name="EmptyVars" type="String" default="" />
<cfset var QueryString = ListRest( ListFirst( Arguments.UrlString , '##' ) , Arguments.Separator ) />
<cfset var Result = {} />
<cfloop index="local.QueryPiece" list=#QueryString# delimiters="#Arguments.Delimiter#">
<cfif NOT find(Arguments.AssignOp,QueryPiece)>
<cfset Result[ UrlDecode( QueryPiece ) ] = Arguments.EmptyVars />
<cfelse>
<cfset Result[ UrlDecode( ListFirst(QueryPiece,Arguments.AssignOp) ) ]
= UrlDecode( ListRest(QueryPiece,Arguments.AssignOp,true) ) />
</cfif>
</cfloop>
<cfreturn Result />
</cffunction>
可以这么简单地使用:
<cfset theUrl = "https://docs.google.com/spreadsheet/ccc?key=0AthiZNZ73LBndUzRTUkplbmNhYWc##gid=0" />
<cfset Data = getParamsFromUrlString( theUrl ) />
<cfdump var=#Data# />
或者它可以用于复杂的非标准 URL 字符串,如下所示:
<cfset theUrl = "https://somewhere/index.jsp;x:145;y:54;z:1;f;d:%23%23;w:%3B" />
<cfset Data = getParamsFromUrlString( theUrl , ';' , ';' , ':' , 'true' ) />
<cfdump var=#Data# />
以及(希望)介于两者之间的一切。