Напомнило «каждому символу — по домику».
Тег php кривой, потому без подсветки:
Код:
$str = 'На Вашем счёте {@рубль;рубля;рублей;5}.';
// Создает callback-функцию, обрабатывающую каждое попадание конструкции {@a;b;c;[d;[e;...]];x}
$callback = function ($matches)
{
$words = explode(';', $matches[1]); // Разделяем a;b;c на array(a, b, c)
$n = $matches[2]; // Число x
// Взято на просторах этого вашего интернета
return $n.' '.$words[$n%10==1&&$n%100!=11?0:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?1:2)];
};
echo preg_replace_callback('/{@([^}]+);(\d+)}/', $callback, $str);