我想从存储为字符串的 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==
应该=
作为值返回,这意味着将 a 更改ListLast
为 aListRest
并将设置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 ) ) />
(如果您需要更通用的解决方案,另一个答案当然仍然有用。)