2011-10-18 5 views
1

PHP 5.1.6で配列を取得しようとしている3つのHTTP Post戻り値があります。 私はこの用語の意味がよく分かりません(ごめんなさい)。XMLスタイルを解析する方法HTTP POST PHPで変数または配列に戻る5.1.6

<?PHP 
// Values the $var could be: 
$var = "<STATUS>SUCCESS</STATUS><BR><TIME>Mon Oct 17 20:44:41 PDT 2011</TIME>"; 
// OR 
$var = "<STATUS>REJECTED</STATUS>"; 
// OR 
$var = "<STATUS>ERROR</STATUS></BR><VALIDATION MESSAGE>200-Service and Zipcode is required.</VALIDATION MESSAGE> "; 

// Output I'd like to see: 
$array = Array ( 
      ['STATUS'] => 'SUCCESS', 
      ['TIME'] => 'Mon Oct 17 20:44:41 PDT 2011', 
      ['VALIDATION MESSAGE'] => '' 
     ); 
// OR 
$array = Array ( 
      ['STATUS'] => 'REJECTED', 
      ['TIME'] => '', 
      ['VALIDATION MESSAGE'] => '' 
     ); 
//OR 
$array = Array ( 
      ['STATUS'] => 'ERROR', 
      ['TIME'] => '', 
      ['VALIDATION MESSAGE'] => '200-Service and Zipcode is required.' 
     ); 

//Another way to look at the desired output array would be: 
/*  
    Array 
     (
      [STATUS] => SUCCESS 
      [TIME] => Mon Oct 17 20:44:41 PDT 2011 
      [VALIDATION MESSAGE] => 
     ) 
// OR 
    Array 
     (
      [STATUS] => REJECTED 
      [TIME] => 
      [VALIDATION MESSAGE] => 
     ) 
// OR 
    Array 
     (
      [STATUS] => ERROR 
      [TIME] => Mon Oct 17 20:44:41 PDT 2011 
      [VALIDATION MESSAGE] => 
     ) 
*/ 
?> 

おそらくpreg_matchか??? (preg_matchはまだこの時点で私に少し不満です) 私は今まで私の車輪を回転させてきました。

ありがとうございます!

+0

SimpleXMLを試してください。これは基本的に、XMLツリーを同等のPHPデータ構造に変換します。 –

+0

$ varが適切なXML形式ではないため、SimpleXMLを試してみるとエラーになるようです。提案ありがとう! – Rob

答えて

1

あなたが単純なパターンを持っているとして、あなただけのsscanfでそれを解析し、配列のキーに割り当てることができます。

$var = "<STATUS>SUCCESS</STATUS><BR><TIME>Mon Oct 17 20:44:41 PDT 2011</TIME>"; 

$r = sscanf($var, '<STATUS>%[^<]</STATUS><BR><TIME>%[^<]</TIME>', 
      $array['STATUS'], $array['TIME']); 

$array

Array 
(
    [STATUS] => SUCCESS 
    [TIME] => Mon Oct 17 20:44:41 PDT 2011 
) 

Demo/Demo (old)

0

は私がそれぞれの状況をカバーする正規表現を修正しています。今すぐ行う必要があるのは、配列のフィールドを満たすcaseステートメントを作成することだけです。あなたの3つの文字列に対する正規表現の

$regex = "/<(STATUS)>(.*)<\/STATUS>(?:<\/?BR>)?(?:<(TIME)>(.*)<\/TIME>)?(?:<(VALIDATION MESSAGE)>(.*)<\/VALIDATION MESSAGE>)?/"; 

preg_match($regex, $var, $m); 


print_r($res) 

// Simply create an empty associative array with the fields you need,defaulting  everything to '', then write a switch statement based on the sizeof($m) and assign the fields. Each case produces a different count. 

結果...

Array ([0] => SUCCESS 
Mon Oct 17 20:44:41 PDT 2011 [1] => STATUS [2] => SUCCESS [3] => TIME [4] => Mon Oct 17 20:44:41 PDT 2011) 

Array ([0] => REJECTED [1] => STATUS [2] => REJECTED) 

Array ([0] => ERROR 
200-Service and Zipcode is required. [1] => STATUS [2] => ERROR [3] => [4] => [5] => VALIDATION MESSAGE [6] => 200-Service and Zipcode is required.) 

答えは確かにあなたの問題を解決しない場合は、左のカウンターをインクリメントしてください。

0

私はhakreのソリューションをif/elseと組み合わせて使用​​して、目的の出力を取り出しました。私は完全な3変数配列を残しましたが、簡単に追加することができました...余分な空変数は必要ないと決めました。私は確かによりエレガントな方法がありますが、これは私が今までに思い付いた最高です。 hakre &レンのおかげで、これを理解できるようになりました!コードは次のとおりです。

<? 
# NOTES: 
# This is just demo code to test if the code works. 
# The echo/print code is just to show me what's going on as the script processes 

    # SIMULATED (Manual) HTTP Post Response Variable 
    # uncomment each to test 
    $var = "<STATUS>SUCCESS</STATUS><BR><TIME>Mon Oct 17 20:44:41 PDT 2011</TIME>"; 
    // OR 
    #$var = "<STATUS>REJECTED</STATUS>"; 
    // OR 
    #$var = "<STATUS>ERROR</STATUS><BR><VALIDATION MESSAGE>100-Invalid Username and Password.</VALIDATION MESSAGE>"; 
    // OR 
    #$var = "<STATUS>Unknown Value</STATUS><BR><WHO KNOWS>Uncaptured</WHO KNOWS>"; 

    $arrayPRE = array_combine 
    (
     array('STATUS'), 
     sscanf($var, '<STATUS>%[^<]</STATUS>') 
    ); 

    echo 'arrayPRE:<pre>'; 
    print_r($arrayPRE); 
    echo '</pre><hr>'; 

if ($arrayPRE['STATUS']=='SUCCESS'){ 

    $array = array_combine 
     (
      array('STATUS', 'TIME'), 
      sscanf($var, '<STATUS>%[^<]</STATUS><BR><TIME>%[^<]</TIME>') 
     ); 
    echo 'SUCCESS<pre>'; 
    print_r($array); 
    echo '</pre>'; 

}elseif($arrayPRE['STATUS']=='REJECTED'){ 

    $array = array_combine 
     (
      array('STATUS'), 
      sscanf($var, '<STATUS>%[^<]</STATUS>') 
     ); 
    echo 'REJECTED<pre>'; 
    print_r($array); 
    echo '</pre>'; 

}elseif($arrayPRE['STATUS']=='ERROR'){ 

    $array = array_combine 
     (
      array('STATUS', 'VALIDATION MESSAGE'), 
      sscanf($var, '<STATUS>%[^<]</STATUS><BR><VALIDATION MESSAGE>%[^<]</VALIDATION MESSAGE>') 
     ); 
    echo 'ERROR<pre>'; 
    print_r($array); 
    echo '</pre>'; 

}else{ 
    //unknown Response - ALERT ADMIN/SEND and RECORD $var 
    echo 'Unknown Response<br>'; 
    echo htmlspecialchars($var);// making the code readable in a browser 
}//end if ($arrayPRE['STATUS']==''{ 


?> 
関連する問題