복붙노트

PHP에서 URL의 동일한 이름을 가진 여러 매개 변수를 가져 오는 방법

PHP

PHP에서 URL의 동일한 이름을 가진 여러 매개 변수를 가져 오는 방법

URL에있는 하나 이상의 매개 변수가 같은 이름을 가질 URL을 처리해야하는 PHP 응용 프로그램이 있습니다. 주어진 키에 대한 모든 값을 검색하는 쉬운 방법이 있습니까? PHP $ _GET은 마지막 값만 반환합니다.

구체적으로 말하자면,이 애플리케이션은 OpenURL 해결 자이며 다음과 같은 URL 매개 변수를 얻을 수 있습니다.

ctx_ver=Z39.88-2004
&rft_id=info:oclcnum/1903126
&rft_id=http://www.biodiversitylibrary.org/bibliography/4323
&rft_val_fmt=info:ofi/fmt:kev:mtx:book
&rft.genre=book
&rft.btitle=At last: a Christmas in the West Indies. 
&rft.place=London,
&rft.pub=Macmillan and co.,
&rft.aufirst=Charles
&rft.aulast=Kingsley
&rft.au=Kingsley, Charles,
&rft.pages=1-352
&rft.tpages=352
&rft.date=1871

(예, 추한 것, 제 세계에 오신 것을 환영합니다). 키 "rft_id"가 두 번 나타납니다.

$ _GET은 이전 값 (info : oclcnum / 1903126)이 덮어 쓰여진 http://www.biodiversitylibrary.org/bibliography/4323 만 반환합니다.

나는 두 가지 가치에 접근하고 싶다. PHP에서도 가능합니까? 그렇지 않다면,이 문제를 어떻게 처리 할 생각인가?

해결법

  1. ==============================

    1.같은 것 :

    같은 것 :

    $query  = explode('&', $_SERVER['QUERY_STRING']);
    $params = array();
    
    foreach( $query as $param )
    {
      list($name, $value) = explode('=', $param, 2);
      $params[urldecode($name)][] = urldecode($value);
    }
    

    당신에게 준다 :

    array(
      'ctx_ver'     => array('Z39.88-2004'),
      'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
      'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
      'rft.genre'   => array('book'),
      'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
      'rft.place'   => array('London'),
      'rft.pub'     => array('Macmillan and co.'),
      'rft.aufirst' => array('Charles'),
      'rft.aulast'  => array('Kingsley'),
      'rft.au'      => array('Kingsley, Charles'),
      'rft.pages'   => array('1-352'),
      'rft.tpages'  => array('352'),
      'rft.date'    => array('1871')
    )
    
  2. ==============================

    2.querystring을 제어하지 않는 것처럼 보이지만 다른 유효한 대답은 보이지 않습니다 : querystring을 파싱하는 대신 이름 끝에 [[] '을 붙이면 PHP는 다음과 같은 배열을 만듭니다. 항목.

    querystring을 제어하지 않는 것처럼 보이지만 다른 유효한 대답은 보이지 않습니다 : querystring을 파싱하는 대신 이름 끝에 [[] '을 붙이면 PHP는 다음과 같은 배열을 만듭니다. 항목.

    IE :

    someurl.php?name[]=aaa&name[]=bbb
    

    다음과 같은 $ _GET을 줄 것입니다.

    array(0=>'aaa', 1=>'bbb')
    
  3. ==============================

    3.$ _SERVER [ 'QUERY_STRING']을 수동으로 구문 분석해야한다고 생각합니다.

    $ _SERVER [ 'QUERY_STRING']을 수동으로 구문 분석해야한다고 생각합니다.

    뭔가 (테스트되지 않음) :

    $query = $_SERVER['QUERY_STRING'];
    $vars = array();
    foreach (explode('&', $query) as $pair) {
        list($key, $value) = explode('=', $pair);
        $vars[] = array(urldecode($key), urldecode($value));
    }
    

    이렇게하면 $ vars 배열을 얻을 수 있습니다.

    array(
        array('ctx_ver'     => 'Z39.88-2004'),
        array('rft_id'      => 'info:oclcnum/1903126'),
        array('rft_id'      => 'http://www.biodiversitylibrary.org/bibliography/4323'),
        array('rft_val_fmt' => 'info:ofi/fmt:kev:mtx:book'),
        array('rft.genre'   => 'book'),
        array('rft.btitle'  => 'At last: a Christmas in the West Indies.'),
        array('rft.place'   => 'London'),
        array('rft.pub'     => 'Macmillan and co.'),
        array('rft.aufirst' => 'Charles'),
        array('rft.aulast'  => 'Kingsley'),
        array('rft.au'      => 'Kingsley, Charles'),
        array('rft.pages'   => '1-352'),
        array('rft.tpages'  => '352'),
        array('rft.date'    => '1871')
    )
    

    Tomalak의 대답을 본 후에, 결과 배열에 대한 그의 데이터 형식이 훨씬 좋아졌습니다. 이름으로 특정 키에 액세스 할 수 있기 때문입니다.

  4. ==============================

    4.바보 같은 폭발 방법을 사용할 필요가 없습니다. 간단한 정규 표현식은 여러 개의 유사한 이름의 매개 변수로 QUERY_STRING을보다 쉽게 ​​수정할 수 있습니다.

    바보 같은 폭발 방법을 사용할 필요가 없습니다. 간단한 정규 표현식은 여러 개의 유사한 이름의 매개 변수로 QUERY_STRING을보다 쉽게 ​​수정할 수 있습니다.

    // Replace `&x=1&x=2` into `x[]=1&x[]=2`
    $qs = preg_replace("/(?<=^|&)(\w+)(?==)/", "$1[]", $_SERVER["QUERY_STRING"]);
    

    parse_str을 사용하는 것만 큼 간단합니다.

    parse_str($qs, $new_GET);
    

    바로 % xy URL 이스케이프를 올바르게 디코딩하는 이점이 있습니다.

    단일 또는 몇 가지 특정 매개 변수를 배열로 추출하기를 원하면 정규식에서 (\ w +) 대신 (id | name)을 사용하십시오.

  5. ==============================

    5.AFAIK 두 번째 값이 첫 번째 값을 덮어 쓰게되므로 $ _GET을 사용하여 중복 된 값을 얻을 수있는 방법이 없습니다.

    AFAIK 두 번째 값이 첫 번째 값을 덮어 쓰게되므로 $ _GET을 사용하여 중복 된 값을 얻을 수있는 방법이 없습니다.

    이 문제를 해결하려면 $ _SERVER [ 'QUERY_STRING']을 (를) 사용하여 원시 쿼리 문자열에 액세스 한 다음 직접 구문 분석하십시오.

  6. ==============================

    6.다음과 같은 쿼리 문자열이 있다고 가정합니다.

    다음과 같은 쿼리 문자열이 있다고 가정합니다.

    당신은 이것을 할 수 있습니다 :

    public static function getMultipleParameters()
        {
            $query = $_SERVER['QUERY_STRING'];
            $vars = array();
            $second = array();
            foreach (explode('&', $query) as $pair) {
                list($key, $value) = explode('=', $pair);
                if('' == trim($value)){
                    continue;
                }
    
                if (array_key_exists($key, $vars)) {
                    if (!array_key_exists($key, $second))
                        $second[$key][] .= $vars[$key];
                    $second[$key][] = $value;
                } else {
                    $vars[$key] = urldecode($value);
                }
            }
            return array_merge($vars, $second);
        }
    

    그것은 준다 :

    array (
      'param1' => '2549',
      'appname' => 
          array (
            0 => 'appName1',
            1 => 'appName2',
            2 => 'appName3',
            3 => 'appName4',
            4 => 'appName5',
      ),
      'apptype' => 'thetype',
      'idsess' => '1231324567980147dzeze55sd4',
      'action' => 'myaction',
    );
    

    희망은 도움이;)

  7. ==============================

    7.이 함수의 내 버전 공유하기

    이 함수의 내 버전 공유하기

    function parse_mstr($query_string,&$query=array()){
        $params  = explode('&', $query_string);
        foreach( $params as $param ){
            $k = $param;
            $v = '';
            if(strpos($param,'=')){
                list($name, $value) = explode('=', $param);
                $k = rawurldecode($name);
                $v = rawurldecode($value);
            }
            if(isset($query[$k])){
                if(is_array($query[$k])){
                    $query[$k][] = $v;
                }else{
                    $query[$k] = array($query[$k],$v);
                }
            }else{
                $query[$k] = $v;
            }
        }
    }
    
  8. from https://stackoverflow.com/questions/353379/how-to-get-multiple-parameters-with-same-name-from-a-url-in-php by cc-by-sa and MIT license