2009-02-17 6 views
1

J'ai une requête CGI comme ceci: 'a = 1 & b = 2 & c = 3'. Je veux l'extraire dans un tableau associatif A tel que $ A [a] = 1, $ A [b] = 2 et $ [c] = 3.Zsh: extraire une requête CGI vers un tableau associatif

Je trouve cette façon, mais je voudrais trouver une plus simple (plus court) chemin à ceci:

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 

(bonus: trouver un moyen de gérer URL valeurs codées)

Répondre

1

Pour les personnes intéressées , ce code analyse les paramètres GET et POST et les stocke dans le tableau associatif global 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)" 
Questions connexes