У меня есть строка, в PHP и строка имеет вхождения шаблона %%abc%%(some substring)%%xyz%%
Внутри основной строки имеется множество вхождений таких подстрок. Каждое из этих вхождений должно быть заменено на строку из массива array('substring1','substring2','substring3','substring4')
зависимости от ответа function()
которая возвращает обратно целое число от 1 до 4.
Я не могу найти эффективный способ сделать это.
Это ситуация, которая требует 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);
Используйте preg_replace_callback()
, например:
preg_replace_callback( '#%%abc%%(.*?)%%xyz%%#', function( $match) { // Do some logic (with $match) to determine what to replace it with return 'replacement'; }, $master_string);