preg_replace_callback con pattern e sostituzione dell'arrays

Ho una function che usa preg_replace() where il model e le sostituzioni sono arrays. Ho bisogno di un contatore per tracciare le sostituzioni, quindi sto convertendo la function per utilizzare preg_replace_callback con una chiusura, ma non riesco a trovare un modo per distinguere quale pattern la corrispondenza è passata alle corrispondenze callback. C'è un modo per fare arrays => arrays replacement usando preg_replace_callback?

Idealmente questo è quello che mi piacerebbe lavorare, ma ovviamente non lo sarà dato che $ pattern e $ replace vengono valutati andando nella chiamata e non in each sostituzione

 function replaceTags($text) { $i = 1; $pattern = arrays( '/\[d\](.*?)\[\/d\]/', '/\[s\](.*?)\[\/s\]/', ); $replace = arrays( '<div id="'.($i++).'">$1</div>', '<span id="'.($i++).'">$1</span>', ); return preg_replace($pattern, $replace, $text); } 

Se ho capito bene, è sufficiente mantenere lo stato tra le chiamate alla function di callback. Il modo ideale per farlo è usare una function membro. Lo stato è memorizzato nell'istanza dell'object. Ogni volta che chiami, puoi modificare l'object, cambiando il tuo stato.

Ho anche aggiunto un'acquisizione extra ai tuoi pattern per differenziare i pattern nella callback.

 <?php class TagReplacer { private $counter = 0; public function replacer($matches) { // modify the state $this->counter++; // return the replacement text using the state if ($matches[1] === "d") $tag = 'div'; else $tag = 'span'; return "<{$tag} id=\"{$this->counter}\">{$matches[2]}</{$tag}>"; } } function replaceTags($text) { $stateObject = new TagReplacer(); $patterns = arrays( '/\[(d)\](.*?)\[\/d\]/', '/\[(s)\](.*?)\[\/s\]/', ); return preg_replace_callback( $patterns, arrays(&$stateObject, "replacer"), $text); } echo replaceTags("zzz[d]123[/d]zzz[s]456[/s]zzz[d]78[/d]zzz[s]90[/s]zzz"); ?> 

L'output è

 zzz<div id="1">123</div>zzz<span id="3">456</span>zzz<div id="2">78</div>zzz<span id="4">90</span>zzz 

Sono rimasto sorpreso dal fatto che gli ID non siano in ordine numbersco. La mia ipotesi è che preg_replace_callback itera attraverso l'arrays di pattern facendo tutte le sostituzioni contemporaneamente per each pattern.