PHPでのデコードクエリ文字列
-
16-09-2019 - |
質問
わかりましたので、私はmod_rewriteのとPHPを使用してREST APIの実装を書いています。私は、HTTP DELETEリクエストの体を介してクエリ文字列を受け入れています(...集団うめき声?)。さておき、両方の前の文の知恵についての引数、私が見つけたことはPHPが自動的にDELETEリクエスト(すなわち、$ _POSTは、要求の本文に登場する形式でエンコードされたクエリ文字列にもかかわらず、空である)のリクエストボディを解析していないことです。これは特に、私は驚きませんでした。私は驚くべき発見したことは、私は、クエリ文字列を解析するための組み込みのPHP関数を見つけることができなかったことでした?私は単に何かを見落としていますか?私のような何かを行うことができます:
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]));
}
}
...ちょうどこれを処理するPHP組み込みの存在ではないことを奇妙に思えます。また、私はスクラブフォームでエンコードされた値にhtmlspecialcharacters&urldecodeを使用すべきではない疑いがある...それは、エンコーディングの異なる種類がありますが、私はまた、私は、フォームエンコードされたデータを復号化するために使用されなければならないPHP関数トラブル目の肥えを抱えていますます。
任意の提案を高く評価されます。
解決
parse_str のがあります。悪い名前は、しかし、あなたが欲しいものを行います。そして、それは何も返さないことを通告、2番目の引数は参照によって渡されます。
他のヒント
それをしない機能があります。 PHPは、自身のためにこれを行う必要があるため、また、APIでの使用のためにそれを開くしない理由はありません。
は、ボイドの変数に文字列を解析します parse_str(文字列$ STR [、アレイ&$ ARR])
それは、クエリであるかのようには、STRを解析します URLやセットを経由して渡された文字列 現在のスコープ内の変数ます。
<?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
はに吸う。
parse_str
は、単純なもののための罰金ですが、それは$_GET
魔法の変数を作成するPHPの組み込み方法と同じではありません。なぜ?!?何も思いつきません。私はまさにPHPの構文解析と一致したと信じて、私の独自のバージョンを開発している(あなたがそうでない場合は表示され任意の例を見つけることができるなら、私に知らせて)ます。
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() );
}
あなたは parse_str
機能を使用することができます:
parse_str($queryString, $args);
http://us2.php.net/manual/en /function.parse-url.phpする
でもparse_urlは、あなたが実際のクエリが含まれているDOCUMENT_URIの部分をつかむのに役立ちます。
あなたは、クエリからの個々の要素を抽出するためにparse_strするオフそのセクションを渡すことができます。
私は、ソート、フィルタリングするクエリ文字列を解析するための簡単なライブラリを構築し、私のREST APIのためのフィールドを選択しました。 ODATAの素朴なバージョン。 形質転換されたクエリ文字列は、オブジェクトおよびまたはオブジェクトのアレイに。 EX用:
フィルターます:
www.example.com/resource?@filters=filedName operator 'the value'
利用可能な演算子EQ、NE、GT、LT、など、iLikeの、ル、GE
$filtersResult = $parser->filters();
$filtersResult[0]->field // name
$filtersResult[0]->operator // eq
$filtersResult[0]->getOperator() // "="
$filtersResult[0]->value // 'what ever'
ソートする:
//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
埋め込み用:
@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);
}
; - )