Dekodierungs Abfrage-Strings in PHP
-
16-09-2019 - |
Frage
Okay, so habe ich eine REST-API-Implementierung mit mod_rewrite und PHP geschrieben. Ich nehme eine Abfragezeichenfolge über den Körper von HTTP DELETE-Anfragen (... kollektiven Stöhnen?). Argumente über die Weisheit der beiden früheren Erklärungen beiseite, was ich gefunden habe, ist, dass PHP nicht automatisch die Anforderung Körper von DELETE-Anfragen analysiert (das heißt $ _POST leer ist trotz formularkodierten Query-String in Körper der Anfrage erscheinen). Das ist nicht besonders überrascht mich. Was ich habe überraschend finden war, dass ich nicht in der Lage gewesen, eine integrierte PHP-Funktion zum Parsen eines Abfrage-String zu finden ?? Habe ich einfach etwas übersehen? Ich kann so etwas tun:
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 PHP integrierte in das zu handhaben wäre. Außerdem vermute ich, soll ich nicht htmlspecialcharacters & urldecode zu schrubben form codierte Werte wurde mit ... es ist eine andere Art der Codierung, aber ich bin auch Probleme erkennend, die PHP-Funktion ich verwenden soll, um formularkodierten Daten zu dekodieren .
wird Irgendwelche Vorschläge geschätzt.
Lösung
Es gibt parse_str . Verruf, aber das tut, was Sie wollen. Und beachten Sie, dass es gibt nichts, das zweite Argument wird als Referenz übergeben.
Andere Tipps
Es gibt eine Funktion, die es tut - http://php.net/parse_str . Da PHP dies für sich selbst zu tun hat, gibt es keinen Grund, nicht auch in der API für die Verwendung zu öffnen.
Analysiert den String in Variable ungültig parse_str (string $ str [, array & $ arr])
Analysiert str, als ob es die Abfrage war Zeichenfolge über eine URL und Sätze übergeben 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
parse_str href="http://codepad.org/s4w6DSh9" rel="nofollow"> saugt .
parse_str
ist für einfache Sachen in Ordnung, aber es ist nicht die gleiche wie PHP gebaut Weg, um die $_GET
magische Variable zu schaffen. Warum?!? Ich habe keine Ahnung. Ich habe meine eigene Version entwickelt, die ich genau übereinstimmt PHP-Parsing glauben (lassen Sie mich wissen, wenn Sie Beispiele finden können, die sonst zeigen).
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() );
}
Sie können die parse_str
Funktion :
parse_str($queryString, $args);
http://us2.php.net/manual/en /function.parse-url.php
parse_url wird Ihnen helfen, den Teil des DOCUMENT_URI zu greifen, dass die tatsächliche Abfrage enthält.
Sie können dann diesen Abschnitt abgehen einzelne Elemente aus der Abfrage zu extrahieren parse_str.
Ich habe eine einfache Bibliothek gebaut Query-String parsen zu filtern, sortieren und Felder für meine Ruhe api. eine naive Version von OData. der Query-String umgewandelt Objekt und oder Arrays von Objekten. für die Ex:
Filter:
www.example.com/resource?@filters=filedName operator 'the value'
verfügbaren Operatoren eq, ne, gt, lt, wie, ilike, le, ge
$filtersResult = $parser->filters();
$filtersResult[0]->field // name
$filtersResult[0]->operator // eq
$filtersResult[0]->getOperator() // "="
$filtersResult[0]->value // 'what ever'
sortieren:
//name is asc , surname desc
@orderby=name,-surname
$sorts = $parser->orderBy() // you can set defaults if u want
$sorts[0]->filed //name
$sorts[0]->direction //asc
$sorts[1]->filed //surname
$sorts[1]->direction //desc
für einbetten:
@embed=resourceOne(@fields=name,code)(@filters=nameembed eq 'what ever'),mobiles(@orderby=sortFieldOne)
$embedResult = $parser->embed(); //return array of embed each
//object contains filters , sort , fields | empty array
$embedResult[0]->resource // resourceOne
$embedResult[0]->fields // array of fields [name,code]
$embedResult[0]->filters // array of filters or empty array
$embedResult[1]->resource // mobiles
$embedResult[1]->orderBy // array of order by objects
public function parseQS($queryString, &$postArray){
parse_str($queryString, $postArray);
}
; -)