代码之家  ›  专栏  ›  技术社区  ›  Jazz

Zsh:将CGI查询提取到关联数组

  •  1
  • Jazz  · 技术社区  · 17 年前

    我有这样一个CGI查询:“a=1&b=2&c=3'。

    我找到了这种方法,但我想找到一种更简单(更短)的方法:

    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
    

    1 回复  |  直到 17 年前
        1
  •  1
  •   Jazz    17 年前

    对于感兴趣的人,这段代码解析GET和POST参数,并将它们存储在全局关联数组QUERY\u参数中。

    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)"