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

Coldfusion 使用CFML从存储为字符串的url解析特定变量,coldfusion,railo,Coldfusion,Railo,我想从存储为字符串的url解析特定url变量键值。似乎可以在ACF下使用底层java库coldfusion.util.HTMLTools,但我也需要它在Railo下工作。还有其他方法吗,或者使用正则表达式是最好的答案吗 我正在尝试检索url变量键的值,而不使用url格式中的锚点,如下例所示。 作为查询字符串的一部分传递的任何变量都可以在URL范围内使用,这是一种“内置”结构 下面是一些示例代码,将在您的示例中输出这些变量: <cfoutput> #url.id# <br

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

我正在尝试检索url变量键的值,而不使用url格式中的锚点,如下例所示。

作为查询字符串的一部分传递的任何变量都可以在URL范围内使用,这是一种“内置”结构

下面是一些示例代码,将在您的示例中输出这些变量:

<cfoutput>
    #url.id# <br />
    #url.key# <br />
    #url.output#
</cfoutput>

#url.id#
#url.key#
#url.output#
在我的回答中添加以下内容,以匹配新信息和mbrusche的示例:

<cfset urlString = listRest( urldata, "?" ) />
<cfoutput>
    <cfloop list="#urlString#" index="URLPiece" delimiter="&">
        Key: #listFirst( urlPiece, "=" )# Value: #listLast( urlPiece, "=" (# <br />
    </cfloop>
</cfoutput>

键:#listFirst(urlPiece,“=”)#值:#listLast(urlPiece,“=”(#

我是在对斯科特的回答发表评论,但时间太长了,所以

约翰写道:


运行下面的示例,我得到的值为0, 但我认为它应该是整个关键价值

它可以简单地用作:

    <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# />


(希望是)介于两者之间的所有内容。

刚刚重读了这个问题,如果您只处理一个特定变量,那么您可以使用一个简单的正则表达式轻松完成这一任务:

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


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

在本例中,url作为字符串存储在数据库中,因此我需要将其作为变量进行解析,而不是作为url作用域的一部分。使用&作为分隔符循环遍历字符串。然后您可以从中分离出值。
#urlpeage#
啊哈…我现在明白了。mbrusche的想法会奏效,但我想我会去掉doma在name and path first:string=listRest(string,“?”)中,循环的第一次迭代将包含协议、域名、路径和文件。在该循环中,您可以执行listFirst(urlPiece,“=”)以获取密钥和listLast(urlPiece,“=”)获取值。我将更新我的示例,因为我认为这可能会误导我。在我的实际url中,键是第一个url变量,因此我不能使用&作为分隔符。运行以下示例时,我的值为0,但我认为它应该是整个键值?键:#listFirst(urlPiece,“=”)#值:#listLast(urlpaike,“=”)#
我认为rematch()的参数是错误的(参数排序在CFML中很少是直观的)好吧,关于排序你是正确的(doh;修复),但是关于很少是直观的-这不是完美的,但也不可怕。也许“很少是直观的”有点苛刻,但充其量也不一致:左(字符串、计数)、插入(子字符串、字符串、位置)、重新匹配(reg_表达式、字符串)、重新替换(字符串、reg_表达式、子字符串[、范围])嘿,试试PHP,很快你就会渴望只处理两个变体(但的确,重赛/重发和重发之间的不匹配尤其严重!)
    <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# />
<cfset Value = rematch( '[?&]key=[^&##]+' , TheUrl ) />
<cfset Value = UrlDecode( ListRest( Value[1] , '=' , true ) ) />