2017-04-03 21 views
-2

この情報をPHPで正しく抽出するにはどうすればよいですか? たとえば、顧客とIDに関する情報が必要です。この情報をどのように抽出するのですか?

内容 shipping_address 通貨 顧客 ....

私はトップレベルのキーを指定するパイプを使用してウェブ上の任意のドキュメントを見つけることができませんので、あなたに

"sessiontoken|s:32:"6450a6e3ced9cdbc38c82e51376efc0f";ClicShoppingCart|a:5:{s:8:"contents";a:1:{i:21;a:1:{s:3:"qty";i:5;}}s:14:"sub_total_cost";i:0;s:10:"total_cost";i:0;s:12:"total_weight";d:0;s:16:"shipping_address";a:2:{s:7:"zone_id";s:3:"265";s:10:"country_id";s:2:"73";}}language|s:2:"fr";currency|s:3:"USD";new_products_id_in_cart|i:21;cart_country_id|s:2:"73";Shop|a:1:{s:17:"NavigationHistory";a:1:{s:8:"snapshot";N;}cart_address_id|N;sendto|i:24;customer_group_id|a:1:{s:18:"customers_group_id";s:1:"0";}customer|a:8:{s:2:"id";i:11;s:10:"first_name";s:4:"XXX";s:9:"last_name";s:7:"XXXXXX";s:13:"email_address";s:21:"[email protected]";s:9:"telephone";N;s:10:"country_id";i:38;s:7:"zone_id";i:76;s:18:"default_address_id";i:24;}cartID|s:5:"57448";billto|i:24;payment|s:21:"Payment\Desjardins\HO";comments|s:0:"";shipping|a:3:{s:2:"id";s:45:"colispostalprioritaire_colispostalprioritaire";s:5:"title";s:70:"Colis International Prioritaire (France) (Livraison vers CA : 0 Kg(s))";s:4:"cost";i:18;}coupon|s:0:"";" 
+2

これはシリアライズさに見えます。 'unserialize() 'を試してください – WillardSolutions

+0

' unserialize() 'は標準の直列化された文字列ではないので動作しません。実際、私はしばらくの間探してきましたが、このようなパイプを使用するシリアル化されたデータフォーマットについての囁きを見つけることはできません。エイミー、これは本当にカスタム制作ですか、あるいはこのフォーマットはある言語で書かれていますか?あなたは創造の支配下にありますか?この形式で扱われる必要がありますか?私はそれが主にPHPのために再フォーマットされているが、100%ではない。あなたの入力文字列についてもっと教えていただけますか? – mickmackusa

答えて

1

ありがとうございましたシリアライズされたデータ、私はこれが自家製の混合物であると仮定しなければなりません。さらに悪いことに、ほとんど正規のシリアル化されたデータ文字列にはいくつかのエラーがあります。この場合、信頼できる処理のために、文字列をカスタム解析する必要があります。

私はあなたのためにその仕事をしました。私のスクリプトはあなたのサンプルデータを修正し(あなたの他の自家製文字列に対して100%有効であることは保証しません)、それを配列に変換します。結果の配列から、キーまたはループで要素に直接アクセスすることができます。 serialize()を使用して、適切なシリアル化されたデータ文字列に変換して、適切な将来のストレージ/処理を行うこともできます。

Demo

コード:

$serialstring='sessiontoken|s:32:"6450a6e3ced9cdbc38c82e51376efc0f";ClicShoppingCart|a:5:{s:8:"contents";a:1:{i:21;a:1:{s:3:"qty";i:5;}}s:14:"sub_total_cost";i:0;s:10:"total_cost";i:0;s:12:"total_weight";d:0;s:16:"shipping_address";a:2:{s:7:"zone_id";s:3:"265";s:10:"country_id";s:2:"73";}}language|s:2:"fr";currency|s:3:"USD";new_products_id_in_cart|i:21;cart_country_id|s:2:"73";Shop|a:1:{s:17:"NavigationHistory";a:1:{s:8:"snapshot";N;}cart_address_id|N;sendto|i:24;customer_group_id|a:1:{s:18:"customers_group_id";s:1:"0";}customer|a:8:{s:2:"id";i:11;s:10:"first_name";s:4:"XXX";s:9:"last_name";s:7:"XXXXXX";s:13:"email_address";s:21:"[email protected]";s:9:"telephone";N;s:10:"country_id";i:38;s:7:"zone_id";i:76;s:18:"default_address_id";i:24;}cartID|s:5:"57448";billto|i:24;payment|s:21:"Payment\Desjardins\HO";comments|s:0:"";shipping|a:3:{s:2:"id";s:45:"colispostalprioritaire_colispostalprioritaire";s:5:"title";s:70:"Colis International Prioritaire (France) (Livraison vers CA : 0 Kg(s))";s:4:"cost";i:18;}coupon|s:0:""'; 
//var_export(unserialize($serialstring)); this fails because the string has errors in it 

if(preg_match_all('/(\w+)\|(.*?)(?=(\w+)\||$)/',$serialstring,$matches)){ 
    foreach($matches[1] as $i=>$k){ 
     $v=$matches[2][$i]; // post-pipe group 
     if(preg_match_all('/s:(\d+):"([^"]*?)"/',$v,$matches2)){ // capture string lengths and values 
      foreach($matches2[1] as $i=>$len){ 
       if(($newlen=strlen($matches2[2][$i]))!=$len){ // if bad string length count, fix it 
        $v=str_replace("s:{$len}:\"{$matches2[2][$i]}\"","s:{$newlen}:\"{$matches2[2][$i]}\"",$v); 
       } 
      } 
     } 
     if(substr_count($v,"{")>substr_count($v,"}")){ // if insufficient closing curly brackets, fix it 
      $v.=str_repeat("}",substr_count($v,"{")-substr_count($v,"}")); 
     } 
     if(!in_array(substr($v,-1),[";","}"])){ 
      $v.=";"; // append semicolon where not ending in } or ; 
     } 
     $result[$k]=unserialize($v); 
    } 
} 
var_export($result); // this is the array 
echo "\n\n"; 
echo serialize($result); // this is the valid serialized data string 
関連する問題