Ваш шаблон замены выглядит нормально, но поскольку вы использовали одинарные кавычки в соответствующем шаблоне, ваша переменная $ num не будет вставлена в него. Вместо этого попробуйте
$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';
Также обратите внимание, что при построении шаблона из «неизвестных» входов, подобных этому, обычно хорошей идеей является использование preg_quote . например,
$patterns[] = '/<ces>(.*?)\+'.preg_quote($num).'(.*?)<\/ces>/';
Хотя я предполагаю, что, учитывая имя переменной, она всегда числовая.