2017-11-13 2 views
0

質問をクリックしていただきありがとうございます。私は配列をシリアル化する文字列内のテキストを見つけて置換しようとしています。たとえば:シリアル化配列を含む文字列内のテキストを置換する

'fgm2wc_options', 'a:19:{s:15:"automatic_empty";N;s:3:"url";s:25:"http://example.com/store/";s:8:"hostname";s:9:"localhost";s:4:"port";s:4:"3306";s:8:"database";s:22:"apgadmin_store_magento";s:8:"username" ... } 

私はstr_replaceでそれを行うことができますが、それは、文字列の長さインジケータ(:25例えば複数可)を変更しません。他のなめらかするhttp://example.com/を変更したいです。

これは私が使用しています関数です。

function recursive_unserialize_replace($old_url = '', $new_url = '', $data = '', $serialised = false) { 
    $new_url = rtrim($new_url, '/'); 
    $data = explode(', ', $data); 

    try { 
     if (is_string($data) && ($unserialized = @unserialize($data)) !== false) { 
      $data = recursive_unserialize_replace($old_url, $new_url, $unserialized, true); 
     } elseif (is_array($data)) { 
      $_tmp = array(); 

      foreach ($data as $key => $value) { 
       $_tmp[ $key ] = recursive_unserialize_replace($old_url, $new_url, $value); 
      } 

      $data = $_tmp; 
      unset($_tmp); 
     } else { 
      if (is_string($data)) { 
       $data = str_replace($old_url, $new_url, $data); 
      } 
     } 

     if ($serialised) { 
      return serialize($data); 
     } 
    } catch(Exception $error) { 

    } 

    return $data; 
} 

任意のアイデア?提案のため

function unserialize_replace($old_url = '', $new_url = '', $database_string = '') { 
    if (substr($old_url, -1) !== '/') { 
     $new_url = rtrim($new_url, '/'); 
    } 

    $serialized_arrays = preg_match_all("/a:\d+:.*\;\}+/", $database_string, $matches); 

    if(!empty($serialized_arrays) && is_array($matches)) { 
     foreach ($matches[ 0 ] as $match) { 
      $unserialized = @unserialize($match); 

      if ($unserialized) { 
       $buffer = str_replace($old_url, $new_url, $unserialized); 
       $buffer = serialize($buffer); 

       $database_string = str_replace($match, $buffer, $database_string); 
      } 
     } 
    } 

    if (is_string($database_string)) { 
     $database_string = str_replace($old_url, $new_url, $database_string); 
    } 

    return $database_string; 
} 

ありがとう:興味がある人々のために

+0

なぜあなたはこれをやっていますか?配列のような複合データ型として操作する必要があるデータを単に維持するだけではどうですか? – GordonM

+0

@ GordonMデータは、私が文字列として読み込んだアップロードされたファイルからです。配列として読み込む方法はありますか? –

+2

元の構造を更新してシリアル化するのはどうしてですか? –

答えて

0

これは私が思い付いたソリューションです。あなたが間違って何かを見て改善できるものがあれば教えてください

関連する問題