Scusa, mi sono accorto ora che ho sbagliato all'inizio il nome di una variabile ma non posso più modificare il messaggio precedente. Il codice corretto quindi è questo:

Codice PHP:
$stringa "{codice_1|valore_1|data_1}{codice_2|valore_2|data_2}";
$pattern "/(?<=\\{)(.*?)\\|(.*?)\\|(.*?)(?=\\})/";
preg_match_all ($pattern$stringa$matches);

/*
$matches è un array multidimensionale restituito dalla funzione con questa struttura (nel caso in questione):

Array (
[0] => Array ( [0] => "codice_1|valore_1|data_1", [1] => "codice_2|valore_2|data_2" ),
[1] => Array ( [0] => "codice_1", [1] => "codice_2" ),
[2] => Array ( [0] => "valore_1", [1] => "valore_2" ),
[3] => Array ( [0] => "data_1", [1] => "data_2" )
)

L'array che si trova con indice 0 nel primo livello non serve.
*/

$valore = array();
$data = array();

// Con un ciclo for accedo a ogni gruppo di dati
for ($i 0$i sizeof($matches[1]); $i++) {
    
// $matches[0][$i] non ti serve, come dicevo prima
    // $matches[1][$i] = "codice" della variabile (es: "codice_1")
    // $matches[2][$i] = "valore" della variabile (es: "valore_1")
    // $matches[3][$i] = "data" della variabile (es: "data_1")
    
    // se poi vuoi raccogliere i valori nelle variabili che hai detto tu:
    
$valore[$matches[1][$i]] = $matches[2][$i];
    
$data[$matches[1][$i]] = $matches[3][$i];