2012-06-24 10 views
27

Ho la seguente dichiarazione HTMLCome utilizzare preg_replace_callback?

[otsection]Wallpapers[/otsection] 
WALLPAPERS GO HERE 

[otsection]Videos[/otsection] 
VIDEOS GO HERE 

Quello che sto cercando di fare è sostituire i tag [otsection] con un div html. Il fermo è che voglio incrementare l'ID del div da 1-> 2-> 3, ecc ..

Così, per esempio, la dichiarazione di cui sopra dovrebbe essere tradotto per

<div class="otsection" id="1">Wallpapers</div> 
WALLPAPERS GO HERE 

<div class="otsection" id="2">Videos</div> 
VIDEOS GO HERE 

Per quanto mi può ricercare, il modo migliore per farlo è tramite preg_replace_callback per incrementare la variabile id tra ogni sostituzione. Ma dopo 1 ora di lavoro su questo, non riesco a farlo funzionare.

Qualsiasi aiuto con questo sarebbe molto apprezzato!

risposta

38

Usa la seguente:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    function($m) { 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    }, 
    $in); 

In particolare, si noti che ho usato una variabile static. Questa variabile persiste attraverso le chiamate alla funzione, il che significa che verrà incrementata ogni volta che viene chiamata la funzione, cosa che accade per ogni corrispondenza.

Inoltre, notare che ho anteposto ots all'ID. Gli ID elemento non dovrebbero iniziare con i numeri.


Per PHP prima di 5.3:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is", 
    create_function('$m',' 
     static $id = 0; 
     $id++; 
     return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>"; 
    '), 
    $in); 
+0

Come hai potuto ottenere il '$ tale dicitura popolato con oggetto? –

+0

@SheikhHeera Questo dovrebbe già essere lì. Di solito uso '$ in' e' $ out' per mostrare dove i dati vanno e vengono fuori. –

+0

Bella risposta, comunque. –

22

Nota: Di seguito è destinato ad essere una risposta generale e non tenta di risolvere il problema specifico del PO come è già stato addressed before .

cosa è preg_replace_callback()?

Questa funzione viene utilizzata per eseguire una ricerca e sostituzione di espressioni regolari. È simile a str_replace(), ma invece di stringhe semplici, cerca un modello di espressioni regolari definito dall'utente e quindi applica la funzione di callback sugli elementi corrispondenti. La funzione restituisce la stringa modificata se le corrispondenze sono trovate, altrimenti la stringa non modificata.

Quando dovrei usarlo?

preg_replace_callback() è molto simile a preg_replace() - l'unica differenza è che invece di specificare una stringa di sostituzione per il secondo parametro, si specifica una funzione di callback.

Usa preg_replace() quando si vuole fare una semplice ricerca e sostituzione regex. Usa preg_replace_callback() quando vuoi fare qualcosa in più della semplice sostituzione. Guarda l'esempio qui sotto per capire come funziona.

Come si usa?

Ecco un esempio per illustrare l'utilizzo della funzione. Qui, stiamo provando a convertire una stringa di data dal formato YYYY-MM-DD a DD-MM-YYYY.

// our date string 
$string = '2014-02-22'; 

// search pattern 
$pattern = '~(\d{4})-(\d{2})-(\d{2})~'; 

// the function call 
$result = preg_replace_callback($pattern, 'callback', $string); 

// the callback function 
function callback ($matches) { 
    print_r($matches); 
    return $matches[3].'-'.$matches[2].'-'.$matches[1]; 
} 

echo $result; 

Qui, il nostro modello di espressione regolare cerca una stringa di data del formato NNNN-NN-NN dove N potrebbe essere una cifra che varia 0-9 (\d è una rappresentazione scorciatoia per la classe del personaggio [0-9]). La funzione di callback verrà chiamata e passata a una matrice di elementi corrispondenti nella stringa specificata.

Il risultato finale sarà:

22-02-2014 

Nota: L'esempio precedente è solo a scopo illustrativo. Si non dovrebbe uso per analizzare le date. Utilizzare invece DateTime::createFromFormat() e DateTime::format(). This question ha più dettagli.