2010-02-02 9 views

risposta

12

Uso :

$count = 0; 
preg_replace_callback('/test/', 'rep_count', $content); 

function rep_count($matches) { 
    global $count; 
    return 'test' . $count++; 
} 
1

preg_replace_callback() vi permetterà di operare sia con la partita prima di tornare per successiva sostituzione.

6

Uso :

class TestReplace { 
    protected $_count = 0; 

    public function replace($pattern, $text) { 
     $this->_count = 0; 
     return preg_replace_callback($pattern, array($this, '_callback'), $text); 
    } 

    public function _callback($matches) { 
     return 'test' . $this->_count++; 
    } 
} 

$replacer = new TestReplace(); 
$replacer->replace('/test/', 'test test test'); // 'test0 test1 test2' 

Nota: L'uso global è la soluzione hard-and-fast ma introduce alcuni problemi, in modo da non fare lo consiglio

+0

globale non ha più problemi che la soluzione oggetto troppo complicata. La gente si blocca su globals in PHP a causa dello stigmatismo C/C++/etc, che è fuori posto. Globali in PHP sono semplicemente variabili con ambito di richiesta. Meno torcere le mani, più pragmatismo. – cletus

4

Dopo l'uscita di PHP5.3 ora possiamo usare una chiusura e la parola chiave use per aggirare il problema global sollevata da Emil sopra:

$text = "item1,\nitem2,\nFINDME:23623,\nfoo1,\nfoo2,\nfoo3,\nFINDME:923653245,\nbar1,\nbar2,\nFINDME:43572342,\nbar3,\nbar4"; 
$pattern = '/FINDME:(\d+)/'; 
$count = 1; 
$text = preg_replace_callback( $pattern 
          , function($match) use (&$count) { 
            $str = "Found match $count: {$match[1]}!"; 
            $count++; 
            return $str; 
           } 
          , $text 
          ); 
echo "<pre>$text</pre>"; 

che restituisce:

item1, 
item2, 
Found match 1: 23623!, 
foo1, 
foo2, 
foo3, 
Found match 2: 923653245!, 
bar1, 
bar2, 
Found match 3: 43572342!, 
bar3, 
bar4 

Nota il use (&$count) seguendo il nome della funzione - questo ci permette di leggere $count nell'ambito della funzione (lo & lo rende passato per riferimento e quindi scrivibile dallo scope o f la funzione).

3

Inoltre, se si vuole evitare l'uso globale:

$count = 0; preg_replace_callback('/test/', function rep_count($matches) use (&$count) { return 'test' . $count++; }, $content);

1

devi solo definire una variabile statica nella funzione di callback:

$result = preg_replace_callback('/test/', function ($m) { 
    static $count = 0; 
    return 'test' . $count++; 
}, $content); 

In questo modo non inquinano lo spazio dei nomi globale.


Per questo caso specifico è possibile utilizzare anche le funzioni semplici:

$parts = explode('test', $content); 
$end = array_pop($parts); 
$result = ''; 

foreach($parts as $k=>$v) { 
    $result .= 'test' . $k; 
} 

$result .= $end; 
Problemi correlati