2013-05-08 5 views
9

Sto cercando di sostituire gli articoli {{key}} nel mio $text con i valori di un array passato. ma quando ho provato ad aggiungere print_r per vedere cosa stava succedendo ho ricevuto un errore Undefined variable: kvPairs. Come posso accedere al mio modulo variabile all'interno dello preg_replace_callback?Come accedere a una variabile all'interno di preg_replace_callback?

public function replaceValues($kvPairs, $text) { 
    $text = preg_replace_callback(
     '/(\{{)(.*?)(\}})/', 
     function ($match) { 
      $attr = trim($match[2]); 
      print_r($kvPairs[strtolower($attr)]); 
      if (isset($kvPairs[strtolower($attr)])) { 
       return "<span class='attr'>" . $kvPairs[strtolower($attr)] . "</span>"; 
      } else { 
       return "<span class='attrUnknown'>" . $attr . "</span>"; 
      } 
     }, 
     $text 
    ); 
    return $text; 
} 

Aggiornamento:

ho provato la cosa global campo di applicazione, ma non funziona neanche. Ho aggiunto 2 dichiarazioni di stampa per vedere cosa sta facendo, uno dentro e uno all'esterno dello preg_replace_callback.

public function replaceValues($kvPairs, $text) { 
    $attrTest = 'date'; 
    print_r("--" . strtolower($attrTest) . "--" . $kvPairs[strtolower($attrTest)] . "--\n"); 
    $text = preg_replace_callback(
     '/(\{{)(.*?)(\}})/', 
     function ($match) { 
      global $kvPairs; 
      $attr = trim($match[2]); 
      print_r("==" . strtolower($attr) . "==" . $kvPairs[strtolower($attr)] . "==\n"); 
      if (isset($kvPairs[strtolower($attr)])) { 
       return "<span class='attr'>" . $kvPairs[strtolower($attr)] . "</span>"; 
      } else { 
       return "<span class='attrUnknown'>" . $attr . "</span>"; 
      } 
     }, 
     $text 
    ); 
    return $text; 
} 

L'output che ottengo è:

--date--1977-05-20-- 
==date==== 

risposta

35

Come la vostra funzione di callback è una chiusura , è possibile passare argomenti aggiuntivi tramite use

function ($match) use ($kvPairs) { 
    ... 
} 

meglio di inquinare lo spazio globale

+0

Mi piacerebbe manipolare $ kvPairs per la prossima partita, questo è possibile o ho bisogno di una variabile globale per questo? – Wikunia

+4

Se è necessario modificare '$ kvPairs' all'interno del callback, lo si passa ___by reference___:' function ($ match) use (& $ kvPairs) { ... } ' –

-1

$kvPairs è fuori del campo di applicazione nella vostra funzione di richiamata, dichiareremo come globale

function($match) { 
    global $kvPairs; 
    ... 
} 
+0

Questo non funziona – Justin808