Чтобы добавить к этому ответу будущих читателей, есть несколько способов сделать его более динамичным.
По сути, вы просто дважды анализируете список с разделителями и вытаскиваете нужные вам фрагменты.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) ) ;
Это вернет:
Затем вы можете просто ссылаться на переменные, которые вам нужны из возвращаемой структуры.
Но если вам нужно создать фактические переменные вместо того, чтобы извлекать их из структуры, вы можете сделать это следующим образом:
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, #
и =
два, которые обязательно вызовут проблемы безкодирование и правильная обработка.