Вопрос по – Разбор конкретной переменной из URL-адреса, хранящегося в виде строки, с CFML

3

Я хочу проанализировать определенное значение ключа переменной URL-адреса из URL-адреса, хранящегося в виде строки. Кажется, что вы можете использовать базовую библиотеку java coldfusion.util.HTMLTools в ACF, но она мне нужна и для Railo. Есть ли другой способ, или использование регулярного выражения лучший ответ?

Я пытаюсь получить значение ключа переменной URL без привязки в формате URL, как показано в следующем примере.http: //example.com ключ = 134324625625435 # GID = 0

Ваш Ответ

3   ответа
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 верно.

Также, если у вас есть строка запроса, например,?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# />

И (надеюсь) все между ними.

именно то решение, которое мне тоже нужно - спасибо, Питер eggwater
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>
В следующем примере я получаю значение 0, но думаю, что это должно быть полное значение ключа? <cfoutput> <cfset theUrl = " Docs.google.com / таблица / ... "/> <cfset theUrl = listRest (theUrl,"? ")> <cfloop list =" # theUrl # "index =" URLPiece "delimiters =" & "> Ключ: #listFirst (urlPiece," = ") # Значение : #listLast (urlPiece, "=") # <br /> </ cfloop> </ cfoutput> John Sieber
В этом случае URL-адрес хранится в базе данных как строка, поэтому мне нужно проанализировать его как переменную, а не как часть области действия URL-адреса. John Sieber
Аааа .... Теперь я понимаю. Идея mbrusche будет работать, но я думаю, что сначала я удалю имя домена и путь: string = listRest (string, "?"), иначе первая итерация цикла будет содержать протокол, имя домена, путь и файл. Внутри этого цикла вы можете затем выполнить listFirst (urlPiece, "="), чтобы получить ключ, и listLast (urlPiece, "="), чтобы получить значение. Scott Stroz
Я собираюсь обновить свой пример, так как думаю, что это вводит в заблуждение. В моем фактическом URL ключ является первой переменной URL, поэтому я не могу использовать & в качестве разделителя. John Sieber
Просмотрите строку, используя & в качестве разделителя. Тогда вы можете отделить значения оттуда.<cfloop list="#string#" index="urlpiece" delimiter="&">#urlpiece#</cfloop> Matt Busche
2

если вы имеете дело только с одной конкретной переменной, вы можете легко сделать это с помощью простого регулярного выражения:

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

(Другой ответ, конечно, все еще полезен, если вам нужно решение более общего назначения.)

Я думаю, что параметры rematch () неверны (порядок параметров редко бывает интуитивно понятен в CFML) Rupert Rawnsley
Вы правы насчет порядка (до, исправлено), но неправильно в отношении редко интуитивно понятного - он не идеален, но и не ужасен. Peter Boughton
Perhaps «редко интуитивно» был немного грубоват, но в лучшем случае несовместим: Left (строка, число), Insert (подстрока, строка, позиция), REMatch (reg_expression, строка), REReplace (строка, reg_expression, substring [, объем ] Rupert Rawnsley
(Но да, несоответствие между повторным сопоставлением / перефразировкой и перестановкой, особенно очень большоенервируе!) Peter Boughton
Heh, попробуйте немного поработать с PHP, и вам скоро захочется иметь дело только с двумя вариантами. ;) Peter Boughton

Похожие вопросы