• User Newbie

    Problema con preg_replace

    Sto creando una specie di template engine, solo che adesso mi sono trovato davanti a un piccolo problema. Sto usando preg_replace per andare a sostituire delle variabili che inserisco all'interno dei template con delle altre che ricevo dal database, ma sto avendo un piccolo problema. Il codice che uso è questo
    [php]
    $content=preg_replace("#{settings_(.+?)}#si","$settings->value['$1']",$content);[/php]
    Lui funziona correttamente, ma al posto di sostituire con il valore della variabile sostituisce mettendo il valore della variabile. In pratica non viene interpretata. Spero che mi possiate dire dove sbaglio.
    Grazie in anticipo


  • User

    Non credo di aver ben compreso cosa intendi, scusa.

    Se però il tuo problema è che la zona selezionata via regexp non viene sostituita con il valore restituito da $settings->value[$1] direi che è normale visto il backlash davanti il simbolo dollaro.

    Per altro, la variabile $1 non è valida: il nome di una variabile non può iniziare con un numero.

    Se siamo nel caso in cui ho inteso cosa vuoi fare, tii consiglio di provare così:
    [PHP]$content=preg_replace("#{settings_(.+?)}#si", $settings->value[$var1], $content);[/PHP]

    Inoltre evita nomi generici come $1, specie se stai progettando un template engine, cerca di dare nomi appropriati alle variabili in quanto i loro nomi devono essere sempre un indicazione al contenuto che ospitano.

    Quando le procedure iniziano a complicarsi questa progettazione maniacale ti torna d'aiuto per future implementazioni tue o di possibili nuovi futuri developer 😉


  • User Newbie

    La zona selezionata via regexp restituisce correttamente il valore. Il problema e che se ad esempio io nel template ho una cosa di questo tipo:

    
    {settings_prova}
    

    Andando a sostituire il valore con preg_replace e stampando il contenuto ottengo

    
    $settings->value['prova']
    

    In pratica a me servirebbe che andasse a sostituire con la stringa contenuta nella variabile $settings->value['prova']


  • User

    Adesso ho capito il perchè dell'1 😛

    Non mi sembra si possa fare tutto in una stringa con preg_replace nello specifico caso in cui serve a te, ti consiglio per cui di provare con un procedimento simile:
    [php]$value = array('prova' => 'funziona :D');

    $source = "{settings_prova}";

    /* Regexp per prelevare l'informazione */
    $regex = "#{settings_(.+?)}#si";
    preg_match_all($regex, $source, $settings);

    /* Per tot risultati trovati, li sostituiamo */
    foreach ($settings[1] as $key => $param)
    $source = str_replace($settings[0][$key], $value[$param], $source);

    echo $source;[/php]Ovviamente va riadattato alla tua situazione, ti basta sostituire qualche variabile, ma dovrebbe funzionare 🙂

    Fammi sapere 😉


  • Super User

    @ptm said:

    Lui funziona correttamente, ma al posto di sostituire con il valore della variabile sostituisce mettendo il valore della variabile.

    o.O

    Non ti seguo... cosa vorresti dire?

    [EDIT] Ho letto solo ora il resto della discussione, non avevo refreshato XD [/EDIT]

    Allora.... potresti risolvere utilizzando una funzione di callback:

    [PHP]
    $content = preg_replace("#{settings_(.+?)}#si", function ($matches) { return $settings->value[$matches[1]]; }, $content);
    [/PHP]

    L'ho scritta al volo, a occhio e croce dovrebbe andare. ( Se non ti vede la variabile settings, raggiungila globalmente con $GLOBALS['settings']->value etc etc... )

    PS: il codice sopra va bene da PHP 5.3 in poi... Perchè usa funzioni anonime. Se hai una versione di PHP inferiore nel tuo server, devi usare la funzione create_function, ed usarla come segue:

    [PHP]
    create_function('$matches', 'return $settings->value[$matches[1]];');
    [/PHP]


  • User Attivo

    Direi che quellon che ti serve è preg_replace_callback - per il resto condivido il suggerimento di PaTeR


  • Super User

    Ops, avevo dimenticato il _callback alla fine XD Grazie per l'appunto

    [PHP]
    $content = preg_replace_callback("#{settings_(.+?)}#si", function ($matches) { return $settings->value[$matches[1]]; }, $content);
    [/PHP]


  • User Newbie

    Grazie mille per la vostra velocità e gentilezza. Ora funziona. Grazie ancora.