从使用CFML存储为字符串的url中解析特定变量

时间:2012-04-19 02:20:26

标签: coldfusion railo

我想从存储为字符串的url中解析特定的url变量键值。看来你可以在ACF下使用底层的java库coldfusion.util.HTMLTools,但我也需要它在Railo下工作。还有其他方法,或者使用正则表达式是最佳答案吗?

我正在尝试检索url变量键的值,而不使用类似于以下示例格式化的url中的锚点。 http://example.com?key=134324625625435#gid=0

3 个答案:

答案 0 :(得分:9)

我发表了对斯科特答案的评论,但它太长了,所以......

约翰写道:

  

运行以下示例我最终得到的值为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# />

并且(希望)介于两者之间。

答案 1 :(得分:4)

作为查询字符串的一部分传递的任何变量都可以在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>

答案 2 :(得分:2)

刚刚重新阅读了这个问题,如果你只处理一个特定的变量,你可以通过简单的正则表达式轻松完成:

<cfset Value = rematch( '[?&]key=[^&##]+' , TheUrl ) />
<cfset Value = UrlDecode( ListRest( Value[1] , '=' , true ) ) />

(如果您需要更通用的解决方案,其他答案当然仍然有用。)

相关问题