我想分析从存储作为一个字符串的URL的特定URL变量键值。 看来你可以使用ACF下底层的Java库coldfusion.util.HTMLTools,但我需要它Railo下正常工作。 有另一种方式,或者使用正则表达式的最佳答案吗?
我试图找回url变量键的值而不在格式类似于下面的示例中的URL锚。 http://example.com?key=134324625625435#gid=0
我想分析从存储作为一个字符串的URL的特定URL变量键值。 看来你可以使用ACF下底层的Java库coldfusion.util.HTMLTools,但我需要它Railo下正常工作。 有另一种方式,或者使用正则表达式的最佳答案吗?
我试图找回url变量键的值而不在格式类似于下面的示例中的URL锚。 http://example.com?key=134324625625435#gid=0
我张贴作为斯科特的答案评论,但它变得太长,所以...
约翰写道:
运行下面的例子中,我结束了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# />
和(希望)之间的一切。
被作为查询字符串的一部分传入的任何变量都在URL范围内都有效 - 这是一个“内置”的结构。
这里是会出来把这些变量在你的榜样一些示例代码:
<cfoutput>
#url.id# <br />
#url.key# <br />
#url.output#
</cfoutput>
添加到我的答案,以配合新的信息和mbrusche的例子:
<cfset urlString = listRest( urldata, "?" ) />
<cfoutput>
<cfloop list="#urlString#" index="URLPiece" delimiter="&">
Key: #listFirst( urlPiece, "=" )# Value: #listLast( urlPiece, "=" (# <br />
</cfloop>
</cfoutput>
刚刚重新阅读的问题,如果你只处理一个特定的变量,你可以很容易地用一个简单的正则表达式做到这一点:
<cfset Value = rematch( '[?&]key=[^&##]+' , TheUrl ) />
<cfset Value = UrlDecode( ListRest( Value[1] , '=' , true ) ) />
(其他答案当然还是有用的,如果你需要一个更通用的解决方案。)