2017-11-13 1 views
0

Vielen Dank für das Klicken auf die Frage. Ich versuche, Text in einer Zeichenfolge zu finden und zu ersetzen, die Arrays serialisiert. Zum Beispiel:Ersetzen von Text innerhalb einer Zeichenfolge, die Arrays serialisiert

'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" ... } 

Ich mag http://example.com/ ändern sonst etw ich es mit str_replace tun können, aber es wird den String-Länge-Indikatoren nicht ändern (z s: 25).

Dies ist eine Funktion, die ich bin mit:

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

Irgendwelche Ideen?

+0

Warum machst du das? Warum verwalten Sie nicht einfach die Daten, die Sie als zusammengesetzten Datentyp wie ein Array bearbeiten müssen? – GordonM

+0

@GordonM Die Daten stammen von einer hochgeladenen Datei, die ich als String gelesen habe, gibt es eine Möglichkeit, sie als Array zu lesen? –

+2

Warum nicht unserialisieren, die ursprüngliche Struktur aktualisieren und dann wieder serialisieren? –

Antwort

0

Für alle Interessierten ist dies die Lösung kam ich mit:

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; 
} 
für die Vorschläge

Dank. Bitte lassen Sie mich wissen, wenn Sie etwas falsch sehen und alles, was ich verbessern kann

Verwandte Themen