سؤال

حسنا، لقد كتبت تطبيق باقي API باستخدام MOD_REWRITE و PHP. أقبل سلسلة استعلام عبر مجموعة طلبات حذف HTTP (... Groan الجماعية؟). حجج حول حكمة كل من العبارات السابقة جانبا، ما وجدته هو أن PHP لا تحليل مجموعة الطلبات تلقائيا من طلبات حذف (IE $ _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.. وبعد اسم سيء، ولكن يفعل ما تريد. ولاحظ أنه لا يعيد شيئا، يتم تمرير الوسيطة الثانية بالرجوع إليها.

نصائح أخرى

هناك وظيفة تفعل ذلك - http://php.net/parse_str.. وبعد نظرا لأن PHP تضطر إلى القيام بذلك لنفسها، فلا يوجد سبب لعدم فتحه أيضا للاستخدام في API.

يوزع السلسلة إلى المتغيرات Void Parse_str (سلسلة $ Str [، صفيف و $ ARR])

PRESES 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 على ما يرام للأشياء البسيطة ولكنها ليست هي نفس طريقة PHP المبنية لخلق $_GET المتغير السحري. لماذا؟!؟ ليس لدي فكره. لقد طورت نسختي الخاصة التي أعتقد أن تطابق تحليل 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 في الاستيلاء على جزء المستند_وري يحتوي على الاستعلام الفعلي.

يمكنك بعد ذلك تمرير هذا القسم إلى PARSE_STR لاستخراج العناصر الفردية من الاستعلام.

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

لقد قمت ببناء مكتبة بسيطة لتحليل سلسلة الاستعلام لتصفية وحقول الفرز وحددها لفي بقية API. نسخة ساذجة من أودياتا. تحولت سلسلة الاستعلام إلى كائن أو صفائف الكائنات. على سبيل المثال

مرشحات:

www.example.com/resource?@filters=filedName operator 'the value'

المشغلين المتوفرين EQ، NE، GT، LT، مثل، ILIKE، LE، 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

isyparser.

public function parseQS($queryString, &$postArray){
  parse_str($queryString, $postArray);
}

;-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top