Analizar a través de una cadena php y reemplazar subcadenas

Tengo una cadena, en PHP y la cadena tiene ocurrencias del patrón %%abc%%(some substring)%%xyz%%

Hay múltiples ocurrencias de tales subcadenas dentro de la cadena maestra. Cada una de estas ocurrencias necesita ser reemplazada por una cadena dentro de una matriz de array('substring1','substring2','substring3','substring4') dependiendo de la respuesta de una function() que devuelve un entero entre 1 y 4.

No soy capaz de encontrar una manera eficiente de hacer esto.

Esta es una situación que requiere preg_replace_callback :

 // Assume this already exists function mapSubstringToInteger($str) { return (strlen($str) % 4) + 1; } // So you can now write this: $pattern = '/%%abc%%(.*?)%%xyz%%/'; $replacements = array('r1', 'r2', 'r3', 'r4'); $callback = function($matches) use ($replacements) { return $replacements[mapSubstringToInteger($matches[1])]; }; preg_replace_callback($pattern, $callback, $input); 

Utilice preg_replace_callback() , como este:

 preg_replace_callback( '#%%abc%%(.*?)%%xyz%%#', function( $match) { // Do some logic (with $match) to determine what to replace it with return 'replacement'; }, $master_string);