ColdFusion - строка в переменную - PullRequest
5 голосов
/ 23 апреля 2019

У меня есть такая строка, которую я получаю из базы данных:

user=me@example.com&name=John

Я хотел бы знать, есть ли простой способ извлечь данные и поместить их в две переменные, user иимя.

Ответы [ 4 ]

6 голосов
/ 23 апреля 2019

@ Marc, согласно предложению @Dan Bracuk, вы можете разделить строку, используя упомянутый разделитель сначала как &, а затем как =.Пожалуйста, обратитесь мой код ниже, который поможет вам.Я надеюсь.

Пример выполнения

<cfset yourInput= 'user=me@example.com&name=John'>
<!--- Get the first value. I mean "user" part --->
<cfset splitFirstPart = listfirst(yourInput,'&', true)>
<cfset splitLastPart = listlast(yourInput, '&', true)>
<!--- Get the second part value --->
<!--- Above values are split by using & --->
<cfset user = listlast(splitFirstPart, '=', true)>
<Cfset name = listlast(splitLastPart, '=', true)>
<!--- 
    Now we can again split the list by using =. 
    Now you can see the result.
--->
<cfoutput>
    User : #user# <br/>
    Name : #name#
</cfoutput>

Если вам нужны какие-либо другие функции и разъяснения CFML, пожалуйста, обратитесь к https://cfdocs.org/

Спасибо.

3 голосов
/ 23 апреля 2019

Вот мой взгляд на то, как решить эту проблему.

Мне нравится иметь структуру в качестве конечного результата.Мне также нравится работать с каждой функцией как неявный цикл.

<cfscript>
yourInput= 'user=me@example.com&name=John';

variables.result = {};
ListEach(yourInput,
   function(item) { variables.result[listfirst(item, "=")] = listLast(item, "="); },
   "&");

writedump(result);
</cfscript>
2 голосов
/ 23 апреля 2019

Чтобы добавить к этому ответу будущих читателей, есть несколько способов сделать его более динамичным.

По сути, вы просто дважды анализируете список с разделителями и вытаскиваете нужные вам фрагменты.ColdFusion позволяет сделать это несколькими способами.

Для иллюстрации я добавил к исходной строке.

string="user=me@example.com&name=John&somethingelse=42&foo&base64Msg=QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg==" ;

Мой предпочтительный способ разобрать это для нас - функция CF, которая возвращает структуру всех частей, которые мне нужны.

public Struct function parseURLParamString( required String inURLStr ) {
    /// Initialize the return struct.
    var retStruct = {} ;
    // Use listEach() function to iterate over the list with delim "&"
    arguments.inURLStr.listeach( 
        function(item){ 
          // listFirst gets 1st list element. listRest() gets all but 1st element. Delim "="
          retStruct[listFirst(item,"=")] = listRest(item,"=") ; 
        }
        , "&"
    ) ;

    return retStruct ;
}

writeDump( parseURLParamString(string) ) ;

Это вернет:

code1

Затем вы можете просто ссылаться на переменные, которые вам нужны из возвращаемой структуры.

Но если вам нужно создать фактические переменные вместо того, чтобы извлекать их из структуры, вы можете сделать это следующим образом:

arguments.inURLStr.listeach( 
    function(item){ 
      variables[listFirst(item,'=')] = listRest(item,"=") ;
    }
    , "&"
) ;

... и затем изменить внешнюю функцию, чтобы либо вернутьVoid или ничего и отбросьте структуру из него.Вы можете ссылаться на переменные как user = #user#.Это потребовало бы, чтобы вы знали переменные заранее, тогда как при передаче определенной структуры вы можете просто зациклить структуру и вывести ключи / значения.Технически вы также можете перебрать область действия variables, но там, вероятно, будет много других переменных.

Если вы хотите, вы также можете использовать getToken(), но он имеет то же самоеограничение, которое listLast() делает.Если ваш value содержит второй текст разделителя (например, дополненную строку Base64), то эти символы будут рассматриваться как разделитель и будут исключены из вашего значения.Для base64Msg = QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg==, getToken() / listLast() вернется QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg, где listRest() даст вам QmVFeGNlbGxlbnRUb0VhY2hPdGhlcg==.Или еще хуже, если символ находится в середине строки, он будет усечен.ListLast() удаляет первый элемент списка с разделителями и возвращает остальную часть списка, поэтому, если ваша строка содержит разделитель, она вернет полное значение.

Наконец, так как это выглядит как строка изURL-адрес, который вы, вероятно, хотите очистить и кодировать строку, прежде чем сохранить ее в базе данных.

Если вы сохраните закодированное значение, оно, вероятно, превратит ваши разделители в их закодированные значения.Вышеуказанные функции поддерживают только односимвольные разделители, поэтому их нельзя будет использовать, как указано выше (если только не происходит декодирование перед отправкой в ​​функцию разделения).listToArray разрешает многосимвольные разделители.Таким образом, это может быть одним из способов их разделения.

В конце концов, есть много символов, которым разрешена строка URL, # и = два, которые обязательно вызовут проблемы безкодирование и правильная обработка.

1 голос
/ 23 апреля 2019

Вы можете использовать «ListToArray», используя «&» в качестве разделителя, чтобы разделить каждое значение, а затем использовать снова (или использовать ListFirst и ListLast, если есть только 2 значения), но на этот раз, используя «=» в качестве разделителя, таким образом, выбудет иметь ["user=me@example.com", "name = John"] в качестве первого результата и [[[user], [me@example.com]], [[name], [John]]] каксекунда.

Обычно я рекомендую использовать структуры вместо простых переменных, здесь приведен один пример

<cfscript>
    /* My Raw string */
    MyString = "user=me@example.com&name=John";

    /* Breaking my single string in multiple values */
    MyArrayOfValues = ListToArray(MyString, "&");

    /* Creating my struct o hold my values */
    MyStruct = StructNew();

    /* Interating over my values */
    for (Value in MyArrayOfValues){
        // First Interaction will be: user=me@example.com and the second will be name=John and etc...
        /* Get My attribute name */
        MyAttributeName = ListFirst(Value, "=");
        /* Get My attribute value */
        MyAttributeValue = ListLast(Value, "=");
        /* Evaluate the values of you borth variables and asign each other */
        Evaluate("MyStruct.#LCase(MyAttributeName)# = '#MyAttributeValue#'");
    }
    /* Here you can see your value printed as struct formed by 2 atributes, name and user, both in lower case */
    writeDump(MyStruct);

    /* Here one example how to use this data */
    writeOutput("
        Hi my name is #MyStruct.name# and my user is #MyStruct.user#!
    ");
</cfscript>

Этот способ является более общим, поскольку у вас, вероятно, будет больше столбцов в вашей базе данных или дажеможет использовать его с другими данными из другой базы данных, всегда следуя той же структуре ... значения, разделенные символом &, а значение и значение = = 1006 *

...