4 Stimmen

Dekodierung von Abfragezeichenfolgen in PHP

Okay, ich habe also eine REST-API-Implementierung mit mod_rewrite und PHP geschrieben. Ich akzeptiere einen Query-String über den Body von HTTP-DELETE-Anfragen (... kollektives Aufstöhnen?). Abgesehen von den Argumenten über die Weisheit der beiden vorherigen Aussagen habe ich festgestellt, dass PHP den Body von DELETE-Anfragen nicht automatisch parst (d. h. $_POST ist leer, obwohl der formularcodierte Query-String im Body der Anfrage erscheint). Das hat mich nicht besonders überrascht. Was mich jedoch überraschte, war, dass ich keine eingebaute PHP-Funktion zum Parsen eines Query-Strings finden konnte? Habe ich einfach etwas übersehen? Ich kann etwas tun wie:

public function parseQS($queryString, &$postArray){
  $queryArray = explode('&', $queryString);
  for($i = 0; $i < count($queryArray); $i++) {
    $thisElement = split('=', $queryArray[$i]);
    $postArray[$thisElement[0]] = htmlspecialchars(urldecode($thisElement[1]));
  }
}

... es scheint nur seltsam, dass es keine eingebaute PHP-Funktion gibt, die dies handhabt. Außerdem vermute ich, dass ich htmlspecialcharacters & urldecode nicht verwenden sollte, um formularverschlüsselte Werte zu schrubben... es ist eine andere Art von Kodierung, aber ich habe auch Schwierigkeiten zu erkennen, welche PHP-Funktion ich verwenden sollte, um formularverschlüsselte Daten zu dekodieren.

Wir sind für jeden Vorschlag dankbar.

8voto

Ionuț G. Stan Punkte 168218

Es gibt Parse_str . Schlechter Name, aber er tut, was Sie wollen. Und beachten Sie, dass es nichts zurückgibt, das zweite Argument wird per Referenz übergeben.

0 Stimmen

parse_str übernimmt nicht das Parsing $_GET genau wie PHP (keine Ahnung warum). Siehe meine Antwort für meine "Lösung".

6voto

Alister Bulman Punkte 33148

Es gibt eine Funktion, die dies tut - http://php.net/parse_str . Da PHP dies für sich selbst tun muss, gibt es keinen Grund, es nicht auch für die Verwendung in der API zu öffnen.

Zerlegt die Zeichenkette in Variablen void parse_str ( string $str [, array &$arr])

Analysiert str, als wäre es die Abfrage String, der über eine URL übergeben wurde, und setzt Variablen im aktuellen Bereich.

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

5voto

Kendall Hopkins Punkte 41041

parse_str ist gut für einfache Dinge, aber es ist nicht dasselbe wie die von PHP entwickelte Methode, die $_GET magische Variable. Warum?!? Ich habe keine Ahnung. Ich habe meine eigene Version entwickelt, die meiner Meinung nach genau mit dem Parsing von PHP übereinstimmt (lassen Sie es mich wissen, wenn Sie irgendwelche Beispiele finden, die das Gegenteil beweisen).

function betterParseStr( $string )
{
    return array_reduce( explode( "&", $string ), function( $array, $string_piece ) {
        if( $string_piece === "" ) return $array;
        $equal_offset = strpos( $string_piece, "=" );
        if( $equal_offset === FALSE ) {
            $key = urldecode( $string_piece );
            $value = "";
        } else {
            $key = urldecode( substr( $string_piece, 0, $equal_offset ) );
            $value = urldecode( substr( $string_piece, $equal_offset + 1 ) );
        }
        if( preg_match( "/^([^\[]*)\[([^\]]*)](.*)$/", $key, $matches ) ) {
            $key_path = array( $matches[1], $matches[2] );
            $rest = $matches[3];
            while( preg_match( "/^\[([^\]]*)](.*)$/", $rest, $matches ) ) {
                $key_path[] = $matches[1];
                $rest = $matches[2];
            }
        } else {
            //replace first [ for _
            //why?!? idk ask PHP it does
            //Example: ?key[[=value -> array( "key_[" => "value" )
            $key_path = array( preg_replace('/\[/', '_', $key, 1 ) );
        }
        if( strlen( $key_path[0] ) > 0 && substr( $key_path[0], 0, 1 ) !== "[" ) {
            $current_node = &$array;
            $last_key = array_pop( $key_path );
            $resolve_key = function( $key, array $array ) {
                if( $key === "" || $key === " " ) {
                    $int_array = array_filter( array_keys( $array ), function( $key ) { return is_int( $key ); } );
                    $key = $int_array ? max( $int_array ) + 1 : 0;
                }
                return $key;
            };
            foreach( $key_path as $key_path_piece ) {
                $key_path_piece = $resolve_key( $key_path_piece, $current_node );
                if( ! array_key_exists( $key_path_piece, $current_node ) || ! is_array( $current_node[$key_path_piece] ) ) {
                    $current_node[$key_path_piece] = array();
                }
                $current_node = &$current_node[$key_path_piece];
            }
            $current_node[$resolve_key( $last_key, $current_node )] = $value;
        }
        return $array;
    }, array() );
}

2voto

Gumbo Punkte 617646

Sie können die parse_str Funktion :

parse_str($queryString, $args);

2voto

Nolte Punkte 1106

http://us2.php.net/manual/en/function.parse-url.php

parse_url hilft Ihnen, den Teil der DOCUMENT_URI zu erfassen, der die eigentliche Abfrage enthält.

Diesen Abschnitt können Sie dann an parse_str weitergeben, um einzelne Elemente aus der Abfrage zu extrahieren.

http://us2.php.net/manual/en/function.parse-str.php

0 Stimmen

Interessant... Ich frage mich, ob es einen Vorteil der Verwendung dieser anstelle von @file_get_contents('php://input')... was ist, was ich derzeit verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X