PHP kod çözme sorgu dizeleri

6 Cevap php

Tamam, ben mod_rewrite ve PHP kullanarak REST API uygulaması yazdım. Ben HTTP vücudun isteklerini SİL üzerinden bir sorgu dizesi kabul ediyorum (... kolektif inilti?). Ne buldum kenara hem önceki ifadeleri, bilgeliği hakkında argümanlar PHP otomatik olarak (yani $ _POST istek vücudunda görülen formu kodlu bir sorgu dizesi rağmen boş) DELETE istekleri istek gövdesini ayrıştırmak olmamasıdır. Bu, özellikle bana sürpriz olmadı. Ne şaşırtıcı buldun ben bir sorgu dize ayrıştırma için yerleşik bir PHP işlevini bulamadı oldum oldu? Ben sadece gözden kaçan bir şey? Ben gibi bir şey yapabilirsiniz:

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]));
  }
}

... Sadece bu işlemek için bir PHP yerleşik olmaz garip görünüyor. Ayrıca, ben htmlspecialcharacters kullanarak ve olmamalıdır şüpheli bodur formu kodlanmış değerlere urldecode ... Bu kodlama farklı bir tür, ama ben de sorun ben form kodlanmış verilerin kodunu kullanarak hangi PHP fonksiyon seçici yaşıyorum.

Herhangi bir öneriniz takdir edilecektir.

6 Cevap

Orada parse_str. Kötü bir isim, ama ne isterseniz onu yapar. Ve hiçbir şey, ikinci argüman başvuru tarafından geçirilen döner dikkat edin.

Orada bunu yapan bir fonksiyon - http://php.net/parse_str. PHP kendisi için bunu yapmak zorunda olduğundan, ayrıca API kullanmak için onu açmak için hiçbir neden yok.

Parses the string into variables void parse_str ( string $str [, array &$arr])

Parses str as if it were the query string passed via a URL and sets variables in the current scope.

<?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

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

parse_url Eğer gerçek sorgu içeren DOCUMENT_URI bir bölümünü kapmak yardımcı olacaktır.

Daha sonra sorgudan tek öğeleri ayıklamak için parse_str kapalı bu bölümü geçebilir.

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

parse_str sucks.

parse_str basit şeyler için gayet iyi ama $_GET sihirli değişken yaratma PHP'nin yerleşik yolu olarak aynı değil. Neden?!? Hiçbir fikrim yok. Ben tam olarak PHP'nin ayrıştırma (aksi gösteren herhangi bir örnek bulabilirsiniz eğer bana bildirin) maçları inanıyorum benim kendi versiyonunu geliştirdik.

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() );
}
public function parseQS($queryString, &$postArray){
  parse_str($queryString, $postArray);
}

;-)