Вопрос по – Разбор конкретной переменной из URL-адреса, хранящегося в виде строки, с CFML
Я хочу проанализировать определенное значение ключа переменной URL-адреса из URL-адреса, хранящегося в виде строки. Кажется, что вы можете использовать базовую библиотеку java coldfusion.util.HTMLTools в ACF, но она мне нужна и для Railo. Есть ли другой способ, или использование регулярного выражения лучший ответ?
Я пытаюсь получить значение ключа переменной URL без привязки в формате URL, как показано в следующем примере.http: //example.com ключ = 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
верно.
Также, если у вас есть строка запроса, например,?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>
<cfloop list="#string#" index="urlpiece" delimiter="&">#urlpiece#</cfloop>
если вы имеете дело только с одной конкретной переменной, вы можете легко сделать это с помощью простого регулярного выражения:
<cfset Value = rematch( '[?&]key=[^&##]+' , TheUrl ) />
<cfset Value = UrlDecode( ListRest( Value[1] , '=' , true ) ) />
(Другой ответ, конечно, все еще полезен, если вам нужно решение более общего назначения.)