2009-02-17 49 views
1

我有一個像這樣的CGI查詢:'a = 1 & b = 2 & c = 3'。我想從一個關聯數組A中提取它,如$ A [a] = 1,$ A [b] = 2和$ [c] = 3。Zsh:將CGI查詢提取到關聯數組

我發現這種方式,但我想找到一個更簡單的(短)的方式是:

QUERY='a=1&b=2&c=3' 
typeset -a T 
T=(${(s:&:)QUERY}) 
typeset -A A 
A=() 
for v in $T; do 
    A+=(${(s:=:)v}) 
done 

(獎金:找到一種方法來處理的URL編碼值)

回答

1

對於那些有興趣,此代碼解析GET和POST參數並將它們存儲在全局關聯數組QUERY_PARAMETERS中。

function parse_query_string() 
{ 
    local query="$1" 
    local -a pairs 
    pairs=(${(s:&:)query}) 
    for v in $pairs; do 
     QUERY_PARAMETERS+=(${(s:=:)v}) # todo: handle parameters without = 
    done 
    for name in ${(k)QUERY_PARAMETERS}; do 
     local value="$QUERY_PARAMETERS[$name]" 
     QUERY_PARAMETERS[$name]="$(url_decode "$value")" 
    done 
} 

function url_decode() 
{ 
    setopt extendedglob 
    local d=${1//\%(#b)([0-F][0-F])/\\\x$match[1]} 
    d=${d//+/ } 
    echo "$d" 
} 

parse_query_string "$QUERY_STRING" 
parse_query_string "$(cat)"