Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    chiarimento su perg_match e preg_replace

    sto facendo un sistema news e per renderlo piuttosto flessibile ho deciso di farlo a tpl in modo che il grafico mi prepari una cosa del genere:

    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <link href="style.css" rel="stylesheet" type="text/css"  />
    <title></title>
    </head>
    
    <body>
    <div class="content">
    <% INIZIO %>
    <div class="ciccio">
    <% CATEGORIE_FORM %></div>
    <% CATEGORIE_RICERCA %>
    
    
    
    
    <% FINE %>
    </div>
    </body>
    </html>
    e poi sarà compito mio andare a sostituire i vari spezzoni con il codice php interessato.
    Per far ciò ho fatto una cosa del genere:

    codice:
    if (preg_match("#(.+)(<% CATEGORIE_FORM %>)(.+)#s",$str))
    {
    	$str=preg_replace("#(<% CATEGORIE_FORM %>)#s", $this->FormCategorie($categoria, $len, $lingua, $action),$str);
    }
    		
    if (preg_match("#(.+)(<% CATEGORIE_RICERCA %>)(.+)#s",$str))
    {
    	$str=preg_replace("#(<% CATEGORIE_RICERCA %>)#s", $this->SceltaLingue($len), $str);
    }
    	
    if (preg_match("#(.+)(<% CATEGORIE_ELENCO %>)(.+)#s",$str))
    {
    	$str=preg_replace("#(<% CATEGORIE_ELENCO %>)#s", $this->GetCategorieHTML(CAT_ADMIN,0,0,$len),$str);
    }
    il codice di per sè funziona, nel senso che dove trova le occorrenze giuste richiama le funzioni ma non capisco perché mi perde quello che ci sta scritto in mezzo, mantenendo invece quello che sta scritto fuori dai delimitatori di inizio e fine. Sapete spiegarmi l'arcano? :master:


    spero di esser riuscito a spiegarmi, in caso contrario sarò ben felice di darvi ulteriori dettagli.
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  2. #2
    cacchio

    è un problema nelle funzioni che richiamo, perché con del testo semplice funziona 'na meraviglia. Quindi il problema è più grosso di quel che pensassi perché devo smazzarmi un sacco di codice...
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  3. #3
    innanziutto devi usare preg_replace_callback per usare funzioni/metodi come replacement. Sintassi per richamare un metodo di una classe:
    Codice PHP:
    preg_replace_callback($rex,array(&$this'cb_function'),$string) ; 
    Poi io proverei a fare una cosa di questo tipo:

    Codice PHP:
    function rpl_callback($mth) {
    $tmp '' ;
    switch(
    $mth[1]){
      case 
    'FORM'$tmp=$this->blabla(); break;
      case 
    'RICERCA'$tmp=$this->blabla();break;
      case 
    'ELENCO'$tmp=$this->blabla();break;
      }
    return 
    $tmp ;
    }


    $rex '#(<% CATEGORIE_(FORM|RICERCA|ELENCO) %>)#' ;
    $str=preg_replace_callback($rex, array(&this,'rpl_callback'), $str) ; 
    approssimativamente.

    EDIT:
    mi sono scordato, ovviamente potresti usare preg_replace attivando nella regex il modificatore "e", lasciando più o meno invariato il codice che hai postato, ma secondo me è più scomodo.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  4. #4
    innanzitutto grazie per la risposta.
    Ma il risultato è sostanzialmente quello che ottengo io, ossia sul testo di partenza che ho postato prima ottengo che le parti che sono prima di <% INIZIO %> e dopo di <% FINE %> rimangono, mentre tra quello che ho dentro mi fa le giuste sostituzioni ma, sempre facendo riferimento a quanto ho scritto sopra, il div clas "ciccio" mi scompare.

    Inoltre con il callback ho una serie di notice perché non mi tiene le variabili categoria, len... e dovrei renderle pubbliche all'interno della classe, visto che sto gestendo il tutto in una classe.

    Comunque mi sa proprio che devo ripassarmi le funzioni che ho scritto perché se al posto di quelle metto un testo normale funziona tutto



    se hai qualche altra idea postala pure che io sono un po' a corto




    ciauz
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  5. #5
    Ma tu quindi prima estrai il contenuto tra INIZIO - FINE e poi esegui le sostituzioni? sostituzioni che mi sa potresti eseguire con str_replace.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  6. #6
    eh si esatto. Estraggo quello che sta tra INIZIO e FINE, perché il resto non lo devo modificare e poi faccio le sostituzioni.

    comunque ho risolto il problema era che nelle funzioni che richiamavo c'era direttamente l'echo della stringa e ho risolto mettendo nelle funzioni un return della stringa e poi solo dopo aver fatto tutte le sostituzioni faccio l'echo.
    In effetti mi sa proprio che potrei usare semplicemente str_replace, non so perché mi ero ostinato ad usare le preg


    grazie degli aiuti...se comunque hai una soluzione alternativa e più elegante in cui potrei usare semplicemente una preg me la posti? gracias
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.